Improved how we detect soft keyboard visibility + using that to hide emoji picker when keyboard is opened
This commit is contained in:
parent
e395cff106
commit
a11e66f404
4 changed files with 35 additions and 6 deletions
|
@ -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()
|
||||
|
|
|
@ -190,6 +190,12 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
|
|||
sharedViewModel.chatRoomFragmentOpenedEvent.value = Event(true)
|
||||
}
|
||||
|
||||
binding.root.addKeyboardInsetListener { keyboardVisible ->
|
||||
if (keyboardVisible && chatSendingViewModel.isEmojiPickerOpen.value == true) {
|
||||
chatSendingViewModel.isEmojiPickerOpen.value = false
|
||||
}
|
||||
}
|
||||
|
||||
Compatibility.setLocusIdInContentCaptureSession(binding.root, chatRoom)
|
||||
|
||||
isSecure = chatRoom.currentParams.isEncryptionEnabled
|
||||
|
|
|
@ -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")
|
||||
|
|
4
app/src/main/res/values-land/dimen.xml
Normal file
4
app/src/main/res/values-land/dimen.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="chat_room_emoji_picker_height">240dp</dimen>
|
||||
</resources>
|
Loading…
Reference in a new issue