fixed crashing when scrolling the suggestions in ABC mode (caused by modifying the RecyclerView from different threads)
This commit is contained in:
parent
b71c989e07
commit
fed5ee10da
3 changed files with 14 additions and 16 deletions
|
|
@ -34,8 +34,6 @@ public class SettingsStore extends SettingsHotkeys {
|
||||||
public final static float SOFT_KEY_V_SHAPE_RATIO_OUTER = (float) Math.pow(SOFT_KEY_V_SHAPE_RATIO_INNER, 2);
|
public final static float SOFT_KEY_V_SHAPE_RATIO_OUTER = (float) Math.pow(SOFT_KEY_V_SHAPE_RATIO_INNER, 2);
|
||||||
public final static int SUGGESTIONS_MAX = 20;
|
public final static int SUGGESTIONS_MAX = 20;
|
||||||
public final static int SUGGESTIONS_MIN = 8;
|
public final static int SUGGESTIONS_MIN = 8;
|
||||||
public final static int SUGGESTIONS_RENDER_DEBOUNCE_TIME = 25; // ms
|
|
||||||
public final static int SUGGESTIONS_RENDER_CLEAR_DEBOUNCE_TIME = 60; // ms
|
|
||||||
public final static int SUGGESTIONS_SELECT_ANIMATION_DURATION = 66;
|
public final static int SUGGESTIONS_SELECT_ANIMATION_DURATION = 66;
|
||||||
public final static int SUGGESTIONS_TRANSLATE_ANIMATION_DURATION = 0;
|
public final static int SUGGESTIONS_TRANSLATE_ANIMATION_DURATION = 0;
|
||||||
public final static int TEXT_INPUT_DEBOUNCE_TIME = 500; // ms
|
public final static int TEXT_INPUT_DEBOUNCE_TIME = 500; // ms
|
||||||
|
|
|
||||||
|
|
@ -47,9 +47,10 @@ public class SuggestionsAdapter extends RecyclerView.Adapter<SuggestionsAdapter.
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(ViewHolder holder, int position) {
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
holder.suggestionItem.setText(mSuggestions.get(position));
|
holder.suggestionItem.setText(mSuggestions.get(position));
|
||||||
|
holder.suggestionItem.setTag(position);
|
||||||
holder.suggestionItem.setTextColor(selectedIndex == position ? colorHighlight : colorDefault);
|
holder.suggestionItem.setTextColor(selectedIndex == position ? colorHighlight : colorDefault);
|
||||||
holder.suggestionItem.setBackgroundColor(selectedIndex == position ? backgroundHighlight : Color.TRANSPARENT);
|
holder.suggestionItem.setBackgroundColor(selectedIndex == position ? backgroundHighlight : Color.TRANSPARENT);
|
||||||
holder.suggestionItem.setOnClickListener(v -> onItemClick.accept(holder.getAdapterPosition()));
|
holder.suggestionItem.setOnClickListener(v -> onItemClick.accept((int) v.getTag()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,10 @@ public class SuggestionsBar {
|
||||||
|
|
||||||
|
|
||||||
public void setMany(@Nullable List<String> newSuggestions, int initialSel, boolean containsGenerated) {
|
public void setMany(@Nullable List<String> newSuggestions, int initialSel, boolean containsGenerated) {
|
||||||
|
if ((suggestions == null || suggestions.isEmpty()) && (newSuggestions == null || newSuggestions.isEmpty())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
suggestions = newSuggestions;
|
suggestions = newSuggestions;
|
||||||
selectedIndex = newSuggestions == null || newSuggestions.isEmpty() ? 0 : Math.max(initialSel, 0);
|
selectedIndex = newSuggestions == null || newSuggestions.isEmpty() ? 0 : Math.max(initialSel, 0);
|
||||||
|
|
||||||
|
|
@ -194,9 +198,9 @@ public class SuggestionsBar {
|
||||||
boolean onlySpecialChars = newSuggestions != null && !newSuggestions.isEmpty() && !(new Text(newSuggestions.get(0)).isAlphabetic());
|
boolean onlySpecialChars = newSuggestions != null && !newSuggestions.isEmpty() && !(new Text(newSuggestions.get(0)).isAlphabetic());
|
||||||
addMany(newSuggestions, mView == null || onlySpecialChars ? Integer.MAX_VALUE : SettingsStore.SUGGESTIONS_MAX);
|
addMany(newSuggestions, mView == null || onlySpecialChars ? Integer.MAX_VALUE : SettingsStore.SUGGESTIONS_MAX);
|
||||||
|
|
||||||
selectedIndex = Math.min(selectedIndex, visibleSuggestions.size() - 1);
|
selectedIndex = Math.max(Math.min(selectedIndex, visibleSuggestions.size() - 1), 0);
|
||||||
|
|
||||||
renderDebounced();
|
render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -266,17 +270,6 @@ public class SuggestionsBar {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reduces flashing of the suggestions bar when the suggestions are empty and saves some resources
|
|
||||||
* by reducing the calls to render().
|
|
||||||
*/
|
|
||||||
private void renderDebounced() {
|
|
||||||
final int delay = visibleSuggestions.isEmpty() ? SettingsStore.SUGGESTIONS_RENDER_CLEAR_DEBOUNCE_TIME : SettingsStore.SUGGESTIONS_RENDER_DEBOUNCE_TIME;
|
|
||||||
delayedDisplayHandler.removeCallbacksAndMessages(null);
|
|
||||||
delayedDisplayHandler.postDelayed(this::render, delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void render() {
|
private void render() {
|
||||||
if (mView == null) {
|
if (mView == null) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -308,6 +301,7 @@ public class SuggestionsBar {
|
||||||
visibleSuggestions.clear();
|
visibleSuggestions.clear();
|
||||||
addMany(suggestions, Integer.MAX_VALUE);
|
addMany(suggestions, Integer.MAX_VALUE);
|
||||||
selectedIndex = scrollBack || selectedIndex >= visibleSuggestions.size() ? visibleSuggestions.size() - 1 : selectedIndex;
|
selectedIndex = scrollBack || selectedIndex >= visibleSuggestions.size() ? visibleSuggestions.size() - 1 : selectedIndex;
|
||||||
|
selectedIndex = Math.max(selectedIndex, 0);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -341,6 +335,11 @@ public class SuggestionsBar {
|
||||||
|
|
||||||
|
|
||||||
private void calculateScrollIndex(int increment) {
|
private void calculateScrollIndex(int increment) {
|
||||||
|
if (visibleSuggestions.isEmpty()) {
|
||||||
|
selectedIndex = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
selectedIndex = selectedIndex + increment;
|
selectedIndex = selectedIndex + increment;
|
||||||
if (selectedIndex == visibleSuggestions.size()) {
|
if (selectedIndex == visibleSuggestions.size()) {
|
||||||
selectedIndex = containsStem() ? 1 : 0;
|
selectedIndex = containsStem() ? 1 : 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue