package tof.cv.mpp;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.readystatesoftware.systembartint.SystemBarTintManager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import tof.cv.mpp.Utils.ConnectionMaker;
import tof.cv.mpp.Utils.DbAdapterConnection;
import tof.cv.mpp.Utils.FilterTextWatcher;
import tof.cv.mpp.Utils.Utils;
import tof.cv.mpp.adapter.IndexAdapter;
import tof.cv.mpp.bo.StationLocation;
import tof.cv.mpp.bo.StationLocationApi;
public class StationPickerActivity extends ActionBarActivity implements
ViewPager.OnPageChangeListener {
MyAdapter mAdapter;
ViewPager mPager;
private static final int ADD_ID = 1;
private static final int REMOVE_ID = 2;
private static final int ADD_EUROPE_ID = 3;
static StationFavListFragment f;
private static DbAdapterConnection mDbHelper;
protected static String[] TITLES;
// , "EUROPE"
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// getSupportFragmentManager().putFragment(outState,
// StationFavListFragment.class.getName(), f);
}
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_tab_picker);
TITLES = new String[]{
getString(R.string.station_picker_title_belgium),
getString(R.string.station_picker_title_favorite)};
setSupportActionBar((Toolbar) findViewById(R.id.my_awesome_toolbar));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setOnPageChangeListener(this);
mDbHelper = new DbAdapterConnection(this);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
// enable status bar tint
tintManager.setStatusBarTintEnabled(true);
// enable navigation bar tint
tintManager.setNavigationBarTintEnabled(true);
tintManager.setTintResource(R.color.primarycolor);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case (android.R.id.home):
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public static class EuroStationListFragment extends StationListFragment {
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, ADD_EUROPE_ID, 0, R.string.action_add_to_favorites);
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case ADD_EUROPE_ID:
String sName = (String) getListAdapter().getItem(
(int) menuInfo.id);
Utils.addAsStarred(sName, "", 1, getActivity());
return true;
default:
return super
.onContextItemSelected((android.view.MenuItem) item);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = null;
v = inflater.inflate(R.layout.fragment_station_list, container,
false);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] list = ConnectionMaker.LIST_OF_EURO_STATIONS;
getListView().setFastScrollEnabled(true);
registerForContextMenu(getListView());
ArrayAdapter<String> a = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, list);
this.setListAdapter(a);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// System.out.println("DO NOTHING!");
}
}
public static class StationListFragment extends ListFragment implements
OnScrollListener {
ArrayList<StationLocation> stationList;
/**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// mNum = getArguments() != null ? getArguments().getInt("num") : 1;
View v = null;
v = inflater.inflate(R.layout.fragment_station_picker, container,
false);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
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;
refreshList(finalLangue.contentEquals("en"));
long delta = System.currentTimeMillis() - mPrefs.getLong("stationsDate", 0);
//Force update
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).setTimeout(1200)
.as(new TypeToken<StationLocationApi>() {
})
.setCallback(new FutureCallback<StationLocationApi>() {
@Override
public void onCompleted(Exception e, StationLocationApi apiList) {
Log.e("CVE"+apiList,""+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).setTimeout(1200)
.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);
Log.e("CVE"+apiList,""+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();
stationList = apiList.station;
}
else
refreshList(finalLangue.contentEquals("en"));
}
});
}
private void refreshList(boolean standart) {
ArrayList<String> list = new ArrayList<>();
if (stationList == null) {
list =new ArrayList<>(Arrays.asList(ConnectionMaker.LIST_OF_STATIONS));
} else {
list.clear();
for (StationLocation aStation : stationList) {
list.add(standart?aStation.getStation():aStation.getName());
}
}
Collections.sort(list);
getListView().setFastScrollEnabled(true);
registerForContextMenu(getListView());
IndexAdapter a = new IndexAdapter(getActivity(),
android.R.layout.simple_list_item_1, list);
EditText filterText = (EditText) getActivity().findViewById(
R.id.search_box);
FilterTextWatcher filterTextWatcher = new FilterTextWatcher(a);
if (filterText != null) {
filterText.addTextChangedListener(filterTextWatcher);
getListView().setTextFilterEnabled(true);
}
getListView().setOnScrollListener(this);
this.setListAdapter(a);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Bundle bundle = new Bundle();
bundle.putString("GARE", l.getItemAtPosition(position).toString());
Intent i = new Intent();
i.putExtras(bundle);
getActivity().setResult(RESULT_OK, i);
getActivity().finish();
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, ADD_ID, 0, R.string.action_add_to_favorites);
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case ADD_ID:
String sName = (String) getListAdapter().getItem(
(int) menuInfo.id);
Utils.addAsStarred(sName, "", 1, getActivity());
return true;
default:
return super
.onContextItemSelected((android.view.MenuItem) item);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
/*
if (mReady && mDialogText != null && firstVisibleItem >0) {
try {
char firstLetter = view.getItemAtPosition(firstVisibleItem)
.toString().charAt(0);
if (!mShowing && firstLetter != mPrevLetter) {
mShowing = true;
mDialogText.setVisibility(View.VISIBLE);
}
mDialogText.setText(((Character) firstLetter).toString());
mHandler.removeCallbacks(mRemoveWindow);
mHandler.postDelayed(mRemoveWindow, 1000);
mPrevLetter = firstLetter;
} catch (Exception e) {
}
}
*/
}
}
public static class StationFavListFragment extends ListFragment {
Cursor mCursor;
/**
* Create a new instance of CountingFragment, providing "num" as an
* argument.
*/
static StationFavListFragment newInstance() {
f = new StationFavListFragment();
return f;
}
@Override
public void onPause() {
super.onPause();
}
/**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v;
v = inflater.inflate(R.layout.fragment_station_list, container,
false);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
updateList();
registerForContextMenu(getListView());
}
public void updateList() {
mDbHelper.open();
try {
mCursor = mDbHelper.fetchAllFavStations();
String[] from = {DbAdapterConnection.KEY_FAV_NAME};
int[] to = {android.R.id.text1};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
getActivity(), android.R.layout.simple_list_item_1,
mCursor, from, to);
setListAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
}
mDbHelper.close();
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Bundle bundle = new Bundle();
mCursor.moveToPosition(position);
bundle.putString("GARE", mCursor.getString(mCursor
.getColumnIndex(DbAdapterConnection.KEY_FAV_NAME)));
Intent i = new Intent();
i.putExtras(bundle);
getActivity().setResult(RESULT_OK, i);
getActivity().finish();
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, REMOVE_ID, 0, R.string.remove);
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
switch (item.getItemId()) {
case REMOVE_ID:
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
mDbHelper.open();
Log.i("", "ID " + menuInfo.id);
mDbHelper.deleteFav(menuInfo.id);
mDbHelper.close();
updateList();
return true;
default:
return super
.onContextItemSelected((android.view.MenuItem) item);
}
}
}
public static class MyAdapter extends FragmentPagerAdapter {
private int mCount = TITLES.length;
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return mCount;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new StationListFragment();
case 1:
return StationFavListFragment.newInstance();
case 2:
return new EuroStationListFragment();
}
return null;
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position % TITLES.length];
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// Log.i("","SCROLLED "+position);
}
@Override
public void onPageSelected(int position) {
if (position == 1) {
f.updateList();
}
}
@Override
public void onPageScrollStateChanged(int state) {
// Log.i("","CHANGED "+state);
}
}