From 77085b915c74bfd2559b786d4cc1de0312fd6c9a Mon Sep 17 00:00:00 2001 From: sspanak Date: Wed, 4 Sep 2024 15:39:03 +0300 Subject: [PATCH] fixed language search crashing for real this time --- .../tt9/preferences/items/ItemTextInput.java | 20 ++++++++++++------- .../PreferenceSearchLanguage.java | 13 ------------ app/src/main/res/layout/pref_input_text.xml | 4 +++- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java b/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java index 37e7e6bc..82b4a614 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java @@ -6,6 +6,8 @@ import android.os.Looper; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.View; import android.widget.EditText; import androidx.annotation.NonNull; @@ -19,7 +21,6 @@ import io.github.sspanak.tt9.util.Logger; abstract public class ItemTextInput extends ScreenPreference implements TextWatcher { @NonNull private final Handler debouncer = new Handler(Looper.getMainLooper()); - private int debounceTime = SettingsStore.TEXT_INPUT_DEBOUNCE_TIME; public ItemTextInput(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); @@ -45,6 +46,7 @@ abstract public class ItemTextInput extends ScreenPreference implements TextWatc Logger.e(getClass().getSimpleName(), "Cannot attach a text change listener. Unable to find the EditText element."); } else { editText.addTextChangedListener(this); + editText.setOnKeyListener(this::ignoreEnter); } } @@ -56,12 +58,16 @@ abstract public class ItemTextInput extends ScreenPreference implements TextWatc @Override public void afterTextChanged(Editable s) { - if (debounceTime > 0) { - debouncer.removeCallbacksAndMessages(null); - debouncer.postDelayed(() -> onChange(s.toString()), debounceTime); - } else { - onChange(s.toString()); - } + debouncer.removeCallbacksAndMessages(null); + debouncer.postDelayed(() -> onChange(s.toString()), SettingsStore.TEXT_INPUT_DEBOUNCE_TIME); + } + + /** + * This prevents IllegalStateException "focus search returned a view that wasn't able to take focus!", + * which is thrown when the EditText is focused and it receives a simulated ENTER key event. + */ + private boolean ignoreEnter(View v, int keyCode, KeyEvent e) { + return keyCode == KeyEvent.KEYCODE_ENTER; } protected abstract void onChange(String word); diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java index b0e2afc6..9185e717 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java @@ -2,17 +2,13 @@ package io.github.sspanak.tt9.preferences.screens.languageSelection; import android.content.Context; import android.util.AttributeSet; -import android.view.inputmethod.EditorInfo; -import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; import java.util.ArrayList; -import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.preferences.items.ItemTextInput; public class PreferenceSearchLanguage extends ItemTextInput { @@ -35,15 +31,6 @@ public class PreferenceSearchLanguage extends ItemTextInput { super(context); } - @Override - public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - EditText editText = holder.itemView.findViewById(R.id.input_text_input_field); - if (editText != null) { - editText.setImeOptions(EditorInfo.IME_ACTION_NONE); - } - } - private void showNoResultItem(boolean show) { if (noResultItem != null) { noResultItem.setVisible(show); diff --git a/app/src/main/res/layout/pref_input_text.xml b/app/src/main/res/layout/pref_input_text.xml index 7d167bc7..5b62a29c 100644 --- a/app/src/main/res/layout/pref_input_text.xml +++ b/app/src/main/res/layout/pref_input_text.xml @@ -22,7 +22,9 @@ android:focusableInTouchMode="true" android:layout_height="wrap_content" android:layout_width="match_parent" - android:minHeight="@dimen/preferences_text_min_height" /> + android:minHeight="@dimen/preferences_text_min_height" + android:singleLine="true" + android:imeOptions="actionNone" />