Improved how we detect soft keyboard visibility + using that to hide emoji picker when keyboard is opened

This commit is contained in:
Sylvain Berfini 2023-04-06 15:35:13 +02:00
parent e395cff106
commit a11e66f404
4 changed files with 35 additions and 6 deletions

View file

@ -30,8 +30,6 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.doOnAttach import androidx.core.view.doOnAttach
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.fragment.app.FragmentContainerView import androidx.fragment.app.FragmentContainerView
@ -205,10 +203,8 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin
registerComponentCallbacks(componentCallbacks) registerComponentCallbacks(componentCallbacks)
findNavController(R.id.nav_host_fragment).addOnDestinationChangedListener(this) 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 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"}") Log.d("[Tabs Fragment] Keyboard is ${if (keyboardVisible) "visible" else "invisible"}")
shouldTabsBeVisibleDueToOrientationAndKeyboard = !portraitOrientation || !keyboardVisible shouldTabsBeVisibleDueToOrientationAndKeyboard = !portraitOrientation || !keyboardVisible
updateTabsFragmentVisibility() updateTabsFragmentVisibility()

View file

@ -190,6 +190,12 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
sharedViewModel.chatRoomFragmentOpenedEvent.value = Event(true) sharedViewModel.chatRoomFragmentOpenedEvent.value = Event(true)
} }
binding.root.addKeyboardInsetListener { keyboardVisible ->
if (keyboardVisible && chatSendingViewModel.isEmojiPickerOpen.value == true) {
chatSendingViewModel.isEmojiPickerOpen.value = false
}
}
Compatibility.setLocusIdInContentCaptureSession(binding.root, chatRoom) Compatibility.setLocusIdInContentCaptureSession(binding.root, chatRoom)
isSecure = chatRoom.currentParams.isEncryptionEnabled isSecure = chatRoom.currentParams.isEncryptionEnabled

View file

@ -33,6 +33,9 @@ import android.widget.SeekBar.OnSeekBarChangeListener
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.Guideline 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.databinding.*
import androidx.emoji2.emojipicker.EmojiPickerView import androidx.emoji2.emojipicker.EmojiPickerView
import androidx.emoji2.emojipicker.EmojiViewItem import androidx.emoji2.emojipicker.EmojiViewItem
@ -67,7 +70,27 @@ fun View.hideKeyboard() {
val imm = val imm =
context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0) 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") @BindingAdapter("android:src")

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="chat_room_emoji_picker_height">240dp</dimen>
</resources>