package com.rthoni.stssaguenay.ui.fragments; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; import android.widget.Toast; import com.luticate.utils.business.LuPromise; import com.rthoni.stssaguenay.R; import com.rthoni.stssaguenay.business.STSBusiness; import com.rthoni.stssaguenay.business.StopsBusiness; import com.rthoni.stssaguenay.business.Utils; import com.rthoni.stssaguenay.dbo.StopsDbo; import java.util.List; import java.util.TimerTask; import java.util.Vector; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by robin on 9/29/16. */ public class StopPickerFragment extends Fragment { @BindView(R.id.listStops) RecyclerView _listStops; @BindView(R.id.textSearch) EditText _searchText; private StopsAdapter _stopsAdapter; private LuPromise.LuConsumer _onStopSelectedConsumer; public static class ViewHolder extends RecyclerView.ViewHolder { public TextView _textView; public ViewHolder(TextView v) { super(v); _textView = v; } } public class StopsAdapter extends RecyclerView.Adapter implements Filterable { private List _allStops; private List _filteredStops; @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.simple_recycler_view_item, parent, false); ViewHolder vh = new ViewHolder((TextView)v); return vh; } @Override public void onBindViewHolder(ViewHolder holder, int position) { final StopsDbo stopDbo = _filteredStops.get(position); holder._textView.setText(stopDbo.getFullName()); holder._textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onStopSelected(stopDbo); } }); } @Override public int getItemCount() { return _filteredStops == null ? 0 : _filteredStops.size(); } public void setStops(List stops, String query) { _allStops = stops; getFilter().filter(query); } public List getStops() { return _allStops; } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { List filteredStops = new Vector<>(); final FilterResults results = new FilterResults(); if (constraint.length() == 0) { filteredStops.addAll(_allStops); } else { for (StopsDbo stop : _allStops) { if (Utils.stringMatch(stop.getFullName(), constraint.toString())) { filteredStops.add(stop); } } } results.values = filteredStops; results.count = filteredStops.size(); return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { _stopsAdapter._filteredStops = (List) results.values; _stopsAdapter.notifyDataSetChanged(); } }; } } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_stop_picker, container, false); ButterKnife.bind(this, v); _stopsAdapter = new StopsAdapter(); _listStops.setAdapter(_stopsAdapter); _listStops.setLayoutManager(new LinearLayoutManager(getContext())); _searchText.addTextChangedListener(new TextWatcher() { Handler handler = new Handler(Looper.getMainLooper() /*UI thread*/); Runnable workRunnable; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(final Editable s) { handler.removeCallbacks(workRunnable); workRunnable = new TimerTask() { @Override public void run() { _stopsAdapter.getFilter().filter(s.toString()); } }; handler.postDelayed(workRunnable, 250); } }); loadStops(); return v; } public void loadStops() { final ProgressDialog progressDialog = new ProgressDialog(getContext()); progressDialog.setIndeterminate(true); progressDialog.show(); StopsBusiness.getAll(STSBusiness.getConfig()) .then(new LuPromise.LuConsumer>() { @Override public void execute(List data) { progressDialog.dismiss(); _stopsAdapter.setStops(data, _searchText.getText().toString()); } }, new LuPromise.LuConsumer() { @Override public void execute(LuPromise.LuPromiseError data) { progressDialog.dismiss(); _stopsAdapter.setStops(new Vector(), _searchText.getText().toString()); Toast.makeText(getContext(), data.getError(), Toast.LENGTH_LONG).show(); } }); } public void onStopSelected(StopsDbo stopsDbo) { if (_onStopSelectedConsumer != null) { _onStopSelectedConsumer.execute(stopsDbo); } } public void setOnStopSelectedConsumer(LuPromise.LuConsumer onStopSelectedConsumer) { _onStopSelectedConsumer = onStopSelectedConsumer; } }