diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt index 350b82aab..02a10e453 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt @@ -1,14 +1,19 @@ package org.koitharu.kotatsu.search.ui.widget +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.KeyEvent +import android.view.MotionEvent import android.view.inputmethod.EditorInfo import androidx.annotation.AttrRes import androidx.appcompat.widget.AppCompatEditText +import androidx.core.content.ContextCompat import com.google.android.material.R import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener +private const val DRAWABLE_END = 2 + class SearchEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @@ -16,6 +21,7 @@ class SearchEditText @JvmOverloads constructor( ) : AppCompatEditText(context, attrs, defStyleAttr) { var searchSuggestionListener: SearchSuggestionListener? = null + private val clearIcon = ContextCompat.getDrawable(context, R.drawable.abc_ic_clear_material) var query: String get() = text?.trim()?.toString().orEmpty() @@ -50,9 +56,32 @@ class SearchEditText @JvmOverloads constructor( lengthAfter: Int, ) { super.onTextChanged(text, start, lengthBefore, lengthAfter) + setCompoundDrawablesRelativeWithIntrinsicBounds( + null, + null, + if (text.isNullOrEmpty()) null else clearIcon, + null, + ) searchSuggestionListener?.onQueryChanged(query) } + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + if (event.action == MotionEvent.ACTION_UP) { + val drawable = compoundDrawablesRelative[DRAWABLE_END] ?: return super.onTouchEvent(event) + val isOnDrawable = drawable.isVisible && if (layoutDirection == LAYOUT_DIRECTION_RTL) { + event.x.toInt() in paddingLeft..(drawable.bounds.width() + paddingLeft) + } else { + event.x.toInt() in (width - drawable.bounds.width() - paddingRight)..(width - paddingRight) + } + if (isOnDrawable) { + text?.clear() + return true + } + } + return super.onTouchEvent(event) + } + override fun clearFocus() { super.clearFocus() text?.clear() diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 446d1ae2f..359e1d52a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -58,7 +58,8 @@ android:imeOptions="actionSearch" android:importantForAutofill="no" android:paddingBottom="1dp" - android:singleLine="true" /> + android:singleLine="true" + tools:drawableEnd="@drawable/ic_clear" />