package tof.cv.mpp;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Filter;
import android.widget.TextView;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.Geofence;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import java.util.ArrayList;
import java.util.List;
import tof.cv.mpp.bo.StationLocation;
import tof.cv.mpp.bo.StationLocationApi;
import tof.cv.mpp.dummy.DummyContent;
public class NotifFragment extends Fragment implements
GoogleApiClient.ConnectionCallbacks {
ArrayList<Geofence> mGeofences;
ArrayList<StationLocation> stationList;
public NotifFragment() {
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(null);
mGeofences = new ArrayList<Geofence>();
addLocationReceipe();
}
private void addLocationReceipe() {
final SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
String langue = getString(R.string.url_lang);
// There is a setting to force dutch when Android is in English.
if (mPrefs.getBoolean("prefnl", false))
langue = "nl";
final String finalLangue = langue;
if (mPrefs.getString("stations", "").length() > 1) {
StationLocationApi cache = new Gson().fromJson(mPrefs.getString("stations", ""), StationLocationApi.class);
stationList = cache.station;
displayDialog();
long delta = System.currentTimeMillis() - mPrefs.getLong("stationsDate", 0);
if (delta > 10 * DateUtils.DAY_IN_MILLIS || !finalLangue.contentEquals(mPrefs.getString("stationsLan", ""))) {
Ion.with(getActivity())
.load("http://api.irail.be/stations.php?format=json&lang=" + finalLangue)
.as(new TypeToken<StationLocationApi>() {
})
.setCallback(new FutureCallback<StationLocationApi>() {
@Override
public void onCompleted(Exception e, StationLocationApi apiList) {
if (apiList != null && apiList.station != null) {
SharedPreferences.Editor ed = mPrefs.edit();
Gson gson = new Gson();
ed.putString("stations", gson.toJson(apiList));
ed.putLong("stationsDate", System.currentTimeMillis());
ed.putString("stationsLan", finalLangue);
ed.apply();
}
}
});
}
} else
Ion.with(getActivity())
.load("http://api.irail.be/stations.php?format=json&lang=" + finalLangue)
.as(new TypeToken<StationLocationApi>() {
})
.setCallback(new FutureCallback<StationLocationApi>() {
@Override
public void onCompleted(Exception e, StationLocationApi apiList) {
if (e != null && e.getMessage() != null)
Snackbar.make(getView(), e.getMessage(), Snackbar.LENGTH_LONG);
if (apiList != null && apiList.station != null) {
SharedPreferences.Editor ed = mPrefs.edit();
Gson gson = new Gson();
ed.putString("stations", gson.toJson(apiList));
ed.putLong("stationsDate", System.currentTimeMillis());
ed.putString("stationsLan", finalLangue);
ed.apply();
stationList = apiList.station;
}
displayDialog();
}
});
}
private void displayDialog() {
final AlertDialog.Builder db = new AlertDialog.Builder(getActivity());
AutoCompleteTextView autoCompleteTextView = new AutoCompleteTextView(getActivity());
AutoCompleteStationAdapter namesAdapter = new AutoCompleteStationAdapter(
getActivity(),
R.layout.autocomplete_item,
R.id.lbl_name,
stationList
);
autoCompleteTextView.setAdapter(namesAdapter);
db.setTitle(R.string.notif_station);
db.setView(autoCompleteTextView);
db.setNegativeButton(R.string.cancel, null);
final AlertDialog alert = db.show();
autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e("CVE",stationList.get(position).getName());
alert.dismiss();
}
});
//autoCompleteTextView.showDropDown();
}
public class AutoCompleteStationAdapter extends ArrayAdapter<StationLocation> {
Context context;
int textViewResourceId;
List<StationLocation> items, tempItems, suggestions;
public AutoCompleteStationAdapter(Context context, int resource, int textViewResourceId, List<StationLocation> items) {
super(context, textViewResourceId, items);
this.context = context;
this.textViewResourceId = textViewResourceId;
this.items = items;
tempItems = new ArrayList<StationLocation>(items); // this makes the difference.
suggestions = new ArrayList<StationLocation>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.autocomplete_item, parent, false);
}
StationLocation names = items.get(position);
if (names != null) {
TextView lblName = (TextView) view.findViewById(R.id.lbl_name);
if (lblName != null)
lblName.setText(names.getName());
}
return view;
}
@Override
public Filter getFilter() {
return nameFilter;
}
/**
* Custom Filter implementation for custom suggestions we provide.
*/
Filter nameFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = ((StationLocation) resultValue).getName();
return str;
}
@Override
protected Filter.FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (StationLocation names : tempItems) {
if (names.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(names);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
List<StationLocation> filterList = (ArrayList<StationLocation>) results.values;
if (results != null && results.count > 0) {
clear();
for (StationLocation names : filterList) {
add(names);
notifyDataSetChanged();
}
}
}
};
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_notif_list, container, false);
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(new MyNotifRecipeAdapter(DummyContent.ITEMS));
}
return view;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
}