import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
-import android.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceManager;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.support.annotation.NonNull;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
-import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
});
private SearchOperation currentSearchOperation = null;
- private final int MAX_SEARCH_HISTORY = 10;
- private final ArrayList<String> searchHistory = new ArrayList<>(MAX_SEARCH_HISTORY);
+ private final int MAX_SEARCH_HISTORY = 100;
+ private final int DEFAULT_SEARCH_HISTORY = 10;
+ private int searchHistoryLimit;
+ private final ArrayList<String> searchHistory = new ArrayList<>(DEFAULT_SEARCH_HISTORY);
private MatrixCursor searchHistoryCursor = new MatrixCursor(new String[] {"_id", "search"});
private TextToSpeech textToSpeech;
for (int i = 0; i < searchHistory.size(); i++) {
ed.putString("history" + i, searchHistory.get(i));
}
- ed.remove("history" + searchHistory.size());
+ for (int i = searchHistory.size(); i <= MAX_SEARCH_HISTORY; i++) {
+ ed.remove("history" + i);
+ }
ed.apply();
}
+ private void addToSearchHistory() {
+ addToSearchHistory(searchView.getQuery().toString());
+ }
+
private void addToSearchHistory(String text) {
- if (text == null || text.isEmpty()) return;
+ if (text == null || text.isEmpty() || searchHistoryLimit == 0) return;
int exists = searchHistory.indexOf(text);
if (exists >= 0) searchHistory.remove(exists);
- else if (searchHistory.size() >= MAX_SEARCH_HISTORY) searchHistory.remove(searchHistory.size() - 1);
+ else if (searchHistory.size() >= searchHistoryLimit) searchHistory.remove(searchHistory.size() - 1);
searchHistory.add(0, text);
searchHistoryCursor = new MatrixCursor(new String[] {"_id", "search"});
for (int i = 0; i < searchHistory.size(); i++) {
fontSizeSp = 14;
}
+ final String searchHistoryLimitStr = prefs.getString(getString(R.string.historySizeKey), "" + DEFAULT_SEARCH_HISTORY);
+ try {
+ searchHistoryLimit = Math.min(Integer.parseInt(searchHistoryLimitStr.trim()), MAX_SEARCH_HISTORY);
+ } catch (NumberFormatException e) {
+ searchHistoryLimit = DEFAULT_SEARCH_HISTORY;
+ }
+
// ContextMenu.
registerForContextMenu(getListView());
@Override
public boolean onSuggestionClick(int position) {
- setSearchText(searchHistory.get(position), true);
+ String h = searchHistory.get(position);
+ addToSearchHistory(h);
+ setSearchText(h, true);
return true;
}
});
if (savedHistory != null && !savedHistory.isEmpty()) {
} else {
savedHistory = new ArrayList<>();
- for (int i = 0; i < MAX_SEARCH_HISTORY; i++) {
+ for (int i = 0; i < searchHistoryLimit; i++) {
String h = prefs.getString("history" + i, null);
if (h == null) break;
savedHistory.add(h);
for (int i = savedHistory.size() - 1; i >= 0; i--) {
addToSearchHistory(savedHistory.get(i));
}
+ addToSearchHistory(text);
setSearchText(text, true);
Log.d(LOG, "Trying to restore searchText=" + text);
@Override
public boolean onQueryTextSubmit(String query) {
Log.d(LOG, "OnQueryTextListener: onQueryTextSubmit: " + searchView.getQuery());
- addToSearchHistory(searchView.getQuery().toString());
+ addToSearchHistory();
hideKeyboard();
return true;
}
};
searchView.setOnQueryTextListener(onQueryTextListener);
searchView.setFocusable(true);
- searchTextView = (AutoCompleteTextView)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
+ searchTextView = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0,
FrameLayout.LayoutParams.WRAP_CONTENT, 1);
customSearchView.addView(searchView, lp);
@Override
protected void onPause() {
super.onPause();
+ addToSearchHistory();
saveSearchHistory();
}
@Override
public void run() {
searchTextView.setThreshold(0);
- searchTextView.showDropDown();
+ try {
+ searchTextView.showDropDown();
+ // ignore any errors, in particular BadTokenException happens a lot
+ } catch (Exception e) {}
}
});
}
updateTTSLanguage(indexIndex);
}
+ @SuppressWarnings("deprecation")
+ private void speak(String text) {
+ textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
+ }
+
private void updateTTSLanguage(int i) {
if (!ttsReady || index == null || textToSpeech == null) {
Log.d(LOG, "Can't updateTTSLanguage.");
searchView.requestFocus();
}
if (searchView.getQuery().toString().length() > 0) {
+ addToSearchHistory();
searchView.setQuery("", false);
}
showKeyboard();
speak.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(android.view.MenuItem item) {
- textToSpeech.speak(textToSpeak, TextToSpeech.QUEUE_FLUSH,
- new HashMap<String, String>());
+ speak(textToSpeak);
return false;
}
});
String text = "";
for (Pair p : pairs) text += p.get(idx);
text = text.replaceAll("\\{[^{}]*\\}", "").replace("{", "").replace("}", "");
- textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH,
- new HashMap<String, String>());
+ speak(text);
return false;
}
});
String text = "";
for (Pair p : pairs) text += p.get(idx);
text = text.replaceAll("\\{[^{}]*\\}", "").replace("{", "").replace("}", "");
- textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH,
- new HashMap<String, String>());
+ speak(text);
return false;
}
});
@Override
public void run() {
setIndexAndSearchText(actualIndexToUse, selectedText, true);
+ addToSearchHistory(selectedText);
}
}, 100);
}
if (hideKeyboard) {
hideKeyboard();
}
- addToSearchHistory(text);
}
private void setSearchText(final String text, final boolean triggerSearch) {