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 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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
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