package com.cafejeunesse.android.fragment.home;
import android.app.FragmentManager;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.cafejeunesse.android.common.view.SlidingTabLayout;
import com.cafejeunesse.android.filemanager.DownloadTask;
import com.cafejeunesse.android.fragment.BasicFragment;
import com.cafejeunesse.android.fragment.Refreshable;
import com.cafejeunesse.android.navigationdrawer.R;
import com.cafejeunesse.android.structure.News;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.model.*;
import net.fortuna.ical4j.model.component.VEvent;
/**
* Created by David Levayer on 17/02/15.
*/
public class HomeFragment extends BasicFragment implements Refreshable, AdapterView.OnItemClickListener {
private ViewPager mViewPager;
private SlidingTabLayout mSlidingTabLayout;
// activités
private final static String CALENDAR_URL = "https://www.google.com/calendar/ical/fvp8k6fun93m32q8pe972sosps%40group.calendar.google.com/public/basic.ics";
// horaire
private final static String SCHEDULE_URL = "https://www.google.com/calendar/ical/cafejeunessedechicoutimi%40gmail.com/public/basic.ics";
private final static String APP_FOLDER_PATH = Environment.getExternalStorageDirectory().getPath() + "/cafe-jeunesse";
private final static String CALENDAR_FILEPATH = APP_FOLDER_PATH + "/calendar.ics";
private final static String SCHEDULE_FILEPATH = APP_FOLDER_PATH + "/schedule.ics";
private final static int CALENDAR_TAB_INDEX = 0;
private final static String CALENDAR_TAB_NAME = "Actualités";
private final static int SCHEDULE_TAB_INDEX = 1;
private final static String SCHEDULE_TAB_NAME = "Horaire";
public final static long TIME_BETWEEN_DOWNLOADS = 86400000;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Chargement générique des fragments de l'application
initFragment(inflater, container, R.layout.fragment_home_main);
return mView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mViewPager = (ViewPager) mView.findViewById(R.id.viewpager);
File f = new File(HomeFragment.APP_FOLDER_PATH);
if (!f.exists()) {
boolean mkdir = f.mkdir();
if (!mkdir) {
Toast.makeText(mContext, mContext.getString(R.string.error_on_creating_dir), Toast.LENGTH_LONG).show();
}
}
DownloadTask.testAndDownload(HomeFragment.CALENDAR_FILEPATH, HomeFragment.CALENDAR_URL, HomeFragment.TIME_BETWEEN_DOWNLOADS, mContext, this);
DownloadTask.testAndDownload(HomeFragment.SCHEDULE_FILEPATH, HomeFragment.SCHEDULE_URL, HomeFragment.TIME_BETWEEN_DOWNLOADS, mContext, this);
refresh(); // todo: make sure this is needed. (I think this is called by testAndDownload since we need to pass a Refreshable (this))
}
private BasicFragment me() {
return this;
}
@Override
public void refresh() {
// en définissant un nouvel Adapter, on force le ViewPager à recharger les onglets
mViewPager.setAdapter(new SamplePagerAdapter());
mSlidingTabLayout = (SlidingTabLayout) mView.findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setViewPager(mViewPager);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
News n = (News) parent.getAdapter().getItem(position);
Bundle b = new Bundle();
b.putString(News.NEWS_TITLE, n.getTitle());
b.putString(News.NEWS_DESCR, n.getArticle());
FragmentManager fm = me().getFragmentManager();
HomeDialogFragment mDialogFragment = new HomeDialogFragment();
mDialogFragment.setArguments(b);
mDialogFragment.show(fm, "home_dialog_fragment");
}
class SamplePagerAdapter extends PagerAdapter {
private ListView mListView;
private NewsArrayAdapter mListViewAdapter;
@Override
public int getCount() {
return 2;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return o == view;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case CALENDAR_TAB_INDEX:
return CALENDAR_TAB_NAME;
case SCHEDULE_TAB_INDEX:
return SCHEDULE_TAB_NAME;
}
return "noName";
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// Inflate a new layout from our resources
View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_home_pager,
container, false);
mListView = (ListView) view.findViewById(R.id.listview_news);
mListViewAdapter = new NewsArrayAdapter(mContext, new ArrayList<News>());
mListView.setAdapter(mListViewAdapter);
mListView.setOnItemClickListener(HomeFragment.this);
reloadNews(position);
// Add the newly created View to the ViewPager
container.addView(view);
// Return the View
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
private void reloadNews(int tabIndex) {
List<News> mNews = null;
mListViewAdapter.clear();
try {
switch (tabIndex) {
case CALENDAR_TAB_INDEX:
mNews = extractNews(HomeFragment.CALENDAR_FILEPATH);
break;
case SCHEDULE_TAB_INDEX:
mNews = extractNews(HomeFragment.SCHEDULE_FILEPATH);
break;
default:
}
if (mNews != null) {
for (News n : mNews)
mListViewAdapter.add(n);
}
} catch (FileNotFoundException ignored) {
Toast.makeText(mContext, mContext.getString(R.string.error_while_opening_ics), Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(mContext, mContext.getString(R.string.error_on_ics_file_open), Toast.LENGTH_LONG).show();
} catch (ParserException e) {
Toast.makeText(mContext, mContext.getString(R.string.error_on_ics_parsing), Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
// todo: extract repetitions for shcedule tab
// todo: check if it's worth adding this data into a db instead
private List<News> extractNews(String path) throws IOException, ParserException {
FileInputStream fin = new FileInputStream(path);
CalendarBuilder builder = new CalendarBuilder();
net.fortuna.ical4j.model.Calendar calendar = builder.build(fin);
ComponentList events = calendar.getComponents(Component.VEVENT);
List<News> news = new ArrayList<>();
for (Object e : events) {
VEvent event = (VEvent) e;
news.add(new News(event.getSummary().getValue(), event.getStartDate().getDate(), event.getDescription().getValue()));
}
return news;
}
}
}