mirror of
https://github.com/florisboard/florisboard.git
synced 2024-09-20 03:52:18 +02:00
Improve media input layout and key press behaviour
This commit is contained in:
parent
7eacc6fb4c
commit
d54a078a70
@ -16,12 +16,11 @@
|
||||
|
||||
package dev.patrickgold.florisboard.ime.media
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.util.Log
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.widget.Button
|
||||
import android.widget.ImageButton
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.ViewFlipper
|
||||
import android.widget.*
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.R
|
||||
@ -54,6 +53,7 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
|
||||
private var activeTab: Tab? = null
|
||||
private var mediaViewFlipper: ViewFlipper? = null
|
||||
private var osTimer: Timer? = null
|
||||
private var tabLayout: TabLayout? = null
|
||||
private val tabViews = EnumMap<Tab, LinearLayout>(Tab::class.java)
|
||||
|
||||
@ -76,6 +76,7 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
* views and layouts.
|
||||
* TODO: evaluate if the view initializing process can be optimized.
|
||||
*/
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun onRegisterInputView(inputView: InputView) {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "onRegisterInputView(inputView)")
|
||||
|
||||
@ -85,9 +86,9 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
|
||||
// Init bottom buttons
|
||||
inputView.findViewById<Button>(R.id.media_input_switch_to_text_input_button)
|
||||
.setOnClickListener { v -> onBottomButtonClick(v) }
|
||||
.setOnTouchListener { view, event -> onBottomButtonEvent(view, event) }
|
||||
inputView.findViewById<ImageButton>(R.id.media_input_backspace_button)
|
||||
.setOnClickListener { v -> onBottomButtonClick(v) }
|
||||
.setOnTouchListener { view, event -> onBottomButtonEvent(view, event) }
|
||||
|
||||
tabLayout = inputView.findViewById(R.id.media_input_tabs)
|
||||
tabLayout?.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
|
||||
@ -130,22 +131,40 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
/**
|
||||
* Handles clicks on the bottom buttons.
|
||||
*/
|
||||
private fun onBottomButtonClick(v: View) {
|
||||
val keyData = when (v.id) {
|
||||
private fun onBottomButtonEvent(view: View, event: MotionEvent?): Boolean {
|
||||
event ?: return false
|
||||
val data = when (view.id) {
|
||||
R.id.media_input_switch_to_text_input_button -> {
|
||||
val keyData = KeyData(KeyCode.SWITCH_TO_TEXT_CONTEXT)
|
||||
florisboard.setActiveInput(R.id.text_input)
|
||||
keyData
|
||||
KeyData(KeyCode.SWITCH_TO_TEXT_CONTEXT)
|
||||
}
|
||||
R.id.media_input_backspace_button -> {
|
||||
val keyData = KeyData(KeyCode.DELETE, type = KeyType.ENTER_EDITING)
|
||||
florisboard.textInputManager.sendKeyPress(keyData)
|
||||
keyData
|
||||
KeyData(KeyCode.DELETE, type = KeyType.ENTER_EDITING)
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
florisboard.keyPressVibrate()
|
||||
florisboard.keyPressSound(keyData)
|
||||
when (event.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
florisboard.keyPressVibrate()
|
||||
florisboard.keyPressSound(data)
|
||||
if (data?.code == KeyCode.DELETE && data.type == KeyType.ENTER_EDITING) {
|
||||
osTimer = Timer()
|
||||
osTimer?.scheduleAtFixedRate(object : TimerTask() {
|
||||
override fun run() {
|
||||
florisboard.textInputManager.sendKeyPress(data)
|
||||
}
|
||||
}, 500, 50)
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
if (event.actionMasked != MotionEvent.ACTION_CANCEL && data != null) {
|
||||
florisboard.textInputManager.sendKeyPress(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
// MUST return false here so the background selector for showing a transparent bg works
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,7 +174,11 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
return when (tab) {
|
||||
Tab.EMOJI -> EmojiKeyboardView(florisboard)
|
||||
Tab.EMOTICON -> EmoticonKeyboardView(florisboard.context)
|
||||
else -> LinearLayout(florisboard)
|
||||
else -> LinearLayout(florisboard.context).apply {
|
||||
addView(TextView(context).apply {
|
||||
text = "not yet implemented"
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,13 +25,16 @@ import android.view.Gravity
|
||||
import android.view.MotionEvent
|
||||
import android.widget.LinearLayout
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.media.MediaInputManager
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyData
|
||||
import dev.patrickgold.florisboard.util.getColorFromAttr
|
||||
|
||||
/**
|
||||
* View class for managing the rendering and the events of a single emoticon keyboard key.
|
||||
*/
|
||||
class EmoticonKeyView : androidx.appcompat.widget.AppCompatTextView {
|
||||
private val florisboard: FlorisBoard = FlorisBoard.getInstance()
|
||||
private val mediaInputManager: MediaInputManager = MediaInputManager.getInstance()
|
||||
var data: EmoticonKeyData? = null
|
||||
set(value) {
|
||||
@ -64,6 +67,8 @@ class EmoticonKeyView : androidx.appcompat.widget.AppCompatTextView {
|
||||
when (event.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
setBackgroundColor(getColorFromAttr(context, R.attr.semiTransparentColor))
|
||||
florisboard.keyPressVibrate()
|
||||
florisboard.keyPressSound(KeyData(0))
|
||||
}
|
||||
MotionEvent.ACTION_UP -> {
|
||||
setBackgroundColor(Color.TRANSPARENT)
|
||||
|
@ -26,12 +26,12 @@
|
||||
android:background="@drawable/button_transparent_bg_on_press"
|
||||
android:soundEffectsEnabled="false"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:text="@string/key__view_characters" />
|
||||
android:text="@string/key__view_characters"/>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1" />
|
||||
android:layout_weight="1"/>
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/media_input_tabs"
|
||||
@ -70,7 +70,7 @@
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1" />
|
||||
android:layout_weight="1"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/media_input_backspace_button"
|
||||
@ -83,7 +83,7 @@
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:src="@drawable/ic_backspace"
|
||||
android:tint="?android:textColor"
|
||||
android:contentDescription="TODO" />
|
||||
android:contentDescription="TODO"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user