package com.amaze.filemanager.services.asynctasks;
import android.graphics.Color;
import android.os.AsyncTask;
import android.text.Editable;
import android.text.Spanned;
import android.text.style.BackgroundColorSpan;
import android.widget.EditText;
import android.widget.ImageButton;
import com.amaze.filemanager.activities.TextReader;
import com.amaze.filemanager.utils.MapEntry;
import com.amaze.filemanager.utils.theme.AppTheme;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Map;
/**
* Created by Vishal on 2/1/16.
*/
public class SearchTextTask extends AsyncTask<Editable, Void, ArrayList<MapEntry>> {
private EditText searchEditText, mInput;
private ArrayList<MapEntry> nodes;
private int searchTextLength;
private ImageButton upButton, downButton;
private TextReader textReader;
private Editable editText;
private String searchSubString;
private StringReader stringReader;
private LineNumberReader lineNumberReader;
public SearchTextTask(TextReader textReader) {
this.textReader = textReader;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
this.searchEditText = textReader.searchEditText;
this.nodes = textReader.nodes;
this.upButton = textReader.upButton;
this.downButton = textReader.downButton;
this.mInput = textReader.mInput;
searchTextLength = searchEditText.length();
editText = mInput.getText();
stringReader = new StringReader(editText.toString());
lineNumberReader = new LineNumberReader(stringReader);
}
@Override
protected ArrayList<MapEntry> doInBackground(Editable... params) {
for (int i = 0; i < (editText.length() - params[0].length()); i++) {
if (searchTextLength == 0 || isCancelled())
break;
searchSubString = editText.subSequence(i, i + params[0].length()).toString();
// comparing and adding searched phrase to a list
if (searchSubString.equalsIgnoreCase(params[0].toString())) {
nodes.add(new MapEntry(new MapEntry.KeyMapEntry(i, i + params[0].length()),
lineNumberReader.getLineNumber()));
}
// comparing and incrementing line number
// ended up using LineNumberReader api instead
try {
lineNumberReader.skip(params[0].length());
} catch (IOException e) {
e.printStackTrace();
}
}
return nodes;
}
@Override
protected void onPostExecute(final ArrayList<MapEntry> mapEntries) {
super.onPostExecute(mapEntries);
for (Map.Entry mapEntry : mapEntries) {
Map.Entry keyMapEntry = (Map.Entry) mapEntry.getKey();
mInput.getText().setSpan(textReader.getAppTheme().equals(AppTheme.LIGHT) ? new BackgroundColorSpan(Color.YELLOW) :
new BackgroundColorSpan(Color.LTGRAY),
(Integer) keyMapEntry.getKey(), (Integer) keyMapEntry.getValue(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
}
if (mapEntries.size()!=0) {
upButton.setEnabled(true);
downButton.setEnabled(true);
// downButton
textReader.onClick(downButton);
} else {
upButton.setEnabled(false);
downButton.setEnabled(false);
}
}
}