Add autofill integration to the keyboard

* Activated autofill support for our input method in method.xml
* Implemented required methods in our IME
* Styled views as similar as possible to the clipboard item
* Added InlineContentViewHorizontalScrollView which properly clips these views,
since they are owned by another process and are usually drawn above our views

This closes #199
This commit is contained in:
Ensar Sarajčić
2023-07-05 12:18:36 +02:00
parent e41c6c0817
commit ab3cfc36f0
10 changed files with 276 additions and 33 deletions

View File

@ -10,6 +10,7 @@ import android.content.Intent
import android.graphics.*
import android.graphics.Paint.Align
import android.graphics.drawable.*
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.os.Message
@ -18,11 +19,14 @@ import android.util.TypedValue
import android.view.*
import android.view.animation.AccelerateInterpolator
import android.view.inputmethod.EditorInfo
import android.widget.LinearLayout
import android.widget.PopupWindow
import android.widget.TextView
import android.widget.inline.InlineContentView
import androidx.annotation.RequiresApi
import androidx.core.animation.doOnEnd
import androidx.core.animation.doOnStart
import androidx.core.view.ViewCompat
import androidx.core.view.*
import androidx.emoji2.text.EmojiCompat
import androidx.emoji2.text.EmojiCompat.EMOJI_SUPPORTED
import com.simplemobiletools.commons.extensions.*
@ -746,8 +750,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
private fun hideClipboardViews() {
mToolbarHolder?.apply {
clipboard_value_holder?.beGone()
clipboard_value_holder?.alpha = 0f
clipboard_value?.beGone()
clipboard_value?.alpha = 0f
clipboard_clear?.beGone()
clipboard_clear?.alpha = 0f
}
@ -764,10 +768,10 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
}
private fun toggleClipboardVisibility(show: Boolean) {
if ((show && mToolbarHolder?.clipboard_value_holder!!.alpha == 0f) || (!show && mToolbarHolder?.clipboard_value_holder!!.alpha == 1f)) {
if ((show && mToolbarHolder?.clipboard_value!!.alpha == 0f) || (!show && mToolbarHolder?.clipboard_value!!.alpha == 1f)) {
val newAlpha = if (show) 1f else 0f
val animations = ArrayList<ObjectAnimator>()
val clipboardValueAnimation = ObjectAnimator.ofFloat(mToolbarHolder!!.clipboard_value_holder!!, "alpha", newAlpha)
val clipboardValueAnimation = ObjectAnimator.ofFloat(mToolbarHolder!!.clipboard_value!!, "alpha", newAlpha)
animations.add(clipboardValueAnimation)
val clipboardClearAnimation = ObjectAnimator.ofFloat(mToolbarHolder!!.clipboard_clear!!, "alpha", newAlpha)
@ -779,13 +783,13 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
animSet.interpolator = AccelerateInterpolator()
animSet.doOnStart {
if (show) {
mToolbarHolder?.clipboard_value_holder?.beVisible()
mToolbarHolder?.clipboard_value?.beVisible()
mToolbarHolder?.clipboard_clear?.beVisible()
}
}
animSet.doOnEnd {
if (!show) {
mToolbarHolder?.clipboard_value_holder?.beGone()
mToolbarHolder?.clipboard_value?.beGone()
mToolbarHolder?.clipboard_clear?.beGone()
}
}
@ -1381,10 +1385,12 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
fun closeClipboardManager() {
mClipboardManagerHolder?.clipboard_manager_holder?.beGone()
mToolbarHolder?.suggestions_holder?.showAllInlineContentViews()
}
private fun openClipboardManager() {
mClipboardManagerHolder!!.clipboard_manager_holder.beVisible()
mToolbarHolder?.suggestions_holder?.hideAllInlineContentViews()
setupStoredClips()
}
@ -1614,4 +1620,25 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
}
return keyColor
}
@RequiresApi(Build.VERSION_CODES.R)
fun addToClipboardViews(it: InlineContentView, addToFront: Boolean = false) {
if (mToolbarHolder?.autofill_suggestions_holder != null) {
val newLayoutParams = LinearLayout.LayoutParams(it.layoutParams)
newLayoutParams.updateMarginsRelative(start = resources.getDimensionPixelSize(R.dimen.normal_margin))
it.layoutParams = newLayoutParams
if (addToFront) {
mToolbarHolder?.autofill_suggestions_holder?.addView(it, 0)
} else {
mToolbarHolder?.autofill_suggestions_holder?.addView(it)
}
}
}
@RequiresApi(Build.VERSION_CODES.R)
fun clearClipboardViews() {
if (mToolbarHolder?.autofill_suggestions_holder != null) {
mToolbarHolder?.autofill_suggestions_holder?.removeAllViews()
}
}
}