package net.osmand.plus.activities.search;
import java.util.List;
import net.osmand.plus.R;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
public abstract class SearchByNameAbstractActivity<T> extends ListActivity {
private EditText searchText;
private Handler handlerToLoop;
private ProgressBar progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.search_by_name);
NamesAdapter namesAdapter = new NamesAdapter(getObjects("")); //$NON-NLS-1$
setListAdapter(namesAdapter);
progress = (ProgressBar) findViewById(R.id.ProgressBar);
searchText = (EditText) findViewById(R.id.SearchText);
searchText.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
setText(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
});
searchText.requestFocus();
progress.setVisibility(View.INVISIBLE);
findViewById(R.id.ResetButton).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
searchText.setText(""); //$NON-NLS-1$
}
});
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
public boolean isFilterableByDefault(){
return false;
}
public Editable getFilter(){
return searchText.getText();
}
protected void updateUIList(final List<T> objects){
runOnUiThread(new Runnable(){
@Override
public void run() {
((NamesAdapter)getListAdapter()).setNotifyOnChange(false);
for(T o : objects){
((NamesAdapter)getListAdapter()).add(o);
}
((NamesAdapter)getListAdapter()).notifyDataSetChanged();
progress.setVisibility(View.INVISIBLE);
}
});
}
public void setText(final String filter) {
if(isFilterableByDefault()){
((NamesAdapter) getListAdapter()).getFilter().filter(filter);
return;
}
((NamesAdapter) getListAdapter()).clear();
if(handlerToLoop == null){
return;
}
handlerToLoop.removeMessages(1);
Message msg = Message.obtain(handlerToLoop, new Runnable() {
@Override
public void run() {
showProgress(View.VISIBLE);
List<T> loadedObjects = getObjects(filter);
if(handlerToLoop != null && !handlerToLoop.hasMessages(1)){
updateUIList(loadedObjects);
}
}
});
msg.what = 1;
handlerToLoop.sendMessageDelayed(msg, 150);
}
private void showProgress(final int v){
runOnUiThread(new Runnable(){
@Override
public void run() {
progress.setVisibility(v);
}
});
}
public abstract List<T> getObjects(String filter);
public abstract void updateTextView(T obj, TextView txt);
public abstract void itemSelected(T obj);
@SuppressWarnings("unchecked")
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
T repo = (T) getListAdapter().getItem(position);
itemSelected(repo);
}
@Override
protected void onResume() {
synchronized (this) {
if (handlerToLoop == null) {
new Thread("Filter data") { //$NON-NLS-1$
@Override
public void run() {
Looper.prepare();
handlerToLoop = new Handler();
Looper.loop();
}
}.start();
}
}
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
synchronized (this) {
if(handlerToLoop != null){
handlerToLoop.post(new Runnable(){
@Override
public void run() {
Looper.myLooper().quit();
}
});
handlerToLoop = null;
}
}
}
class NamesAdapter extends ArrayAdapter<T> {
NamesAdapter(List<T> list) {
super(SearchByNameAbstractActivity.this, R.layout.searchbyname_list, list);
}
public View getView(int position, View convertView, ViewGroup parent) {
View row;
if (convertView != null) {
row = convertView;
} else {
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.searchbyname_list, parent, false);
}
TextView label = (TextView) row.findViewById(R.id.NameLabel);
updateTextView(getItem(position), label);
return row;
}
}
}