package com.rthoni.stssaguenay.ui.fragments; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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.SchedulesBusiness; import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo; import com.rthoni.stssaguenay.dbo.SchedulesDbo; import org.joda.time.DateTimeZone; import org.joda.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.TimeZone; import java.util.Vector; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by robin on 9/29/16. */ public class HomeFragment extends Fragment { @BindView(R.id.listFavouritesStops) RecyclerView _favouritesStopsList; @BindView(R.id.swipeContainer) SwipeRefreshLayout _swipeRefreshLayout; FavouriteStopsAdapter _adapter; public static class ViewHolder extends RecyclerView.ViewHolder { public View _parentView; public TextView _textView; public TextView _textView2; public ViewHolder(View v) { super(v); _parentView = v; } } public class FavouriteStopsAdapter extends RecyclerView.Adapter { private List _favourites; private List _schedules; @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.favourite_stop_recycler_view_item, parent, false); ViewHolder vh = new ViewHolder(v); vh._textView = (TextView) v.findViewById(R.id.textView); vh._textView2 = (TextView) v.findViewById(R.id.textView2); return vh; } @Override public void onBindViewHolder(ViewHolder holder, int position) { final UserFavouriteStopsDbo favouriteStopDbo = _favourites.get(position); holder._textView.setText(favouriteStopDbo.getStop().getFullName()); holder._parentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onFavouriteClicked(favouriteStopDbo); } }); holder._parentView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onFavouriteLongClicked(favouriteStopDbo); return true; } }); if (_schedules != null) { List schedules = new Vector<>(); for (SchedulesDbo schedule : _schedules) { if (schedule.getStopId().equals(favouriteStopDbo.getStop().getId())) { schedules.addAll(schedule.getSchedules()); } } Collections.sort(schedules); schedules.size(); StringBuilder text = new StringBuilder(); for (int i = 0; i < Math.min(5, schedules.size()); ++i) { if (i > 0) { text.append(", "); } text.append(schedules.get(i).toString("HH:mm")); } holder._textView2.setText(text.toString()); } else { holder._textView2.setText(R.string.loading_schedules); } } @Override public int getItemCount() { return _favourites == null ? 0 : _favourites.size(); } public void setFavourites(List favourites) { _favourites = favourites; _schedules = null; notifyDataSetChanged(); } public List getFavourites() { return _favourites; } public List getSchedules() { return _schedules; } public void setSchedules(List schedules) { _schedules = schedules; notifyDataSetChanged(); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_home, container, false); ButterKnife.bind(this, v); _adapter = new FavouriteStopsAdapter(); _favouritesStopsList.setAdapter(_adapter); _favouritesStopsList.setLayoutManager(new LinearLayoutManager(getContext())); _swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { loadSchedules(); } }); loadFavourites(); return v; } public void loadFavourites() { List favourites = STSBusiness.getFavouriteStops(getContext()); _adapter.setFavourites(favourites); loadSchedules(); } public void onFavouriteClicked(UserFavouriteStopsDbo favouriteStopDbo) { } public void onFavouriteLongClicked(final UserFavouriteStopsDbo favouriteStopDbo) { new AlertDialog.Builder(getContext()) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(R.string.favourite_remove) .setMessage(getString(R.string.favourite_remove_confirm, favouriteStopDbo.getStop().getFullName())) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { List favouriteStopDbos = _adapter.getFavourites(); favouriteStopDbos.remove(favouriteStopDbo); STSBusiness.setFavouriteStops(getContext(), favouriteStopDbos); Toast.makeText(getContext(), getString(R.string.favourite_removed, favouriteStopDbo.getStop().getFullName()), Toast.LENGTH_LONG).show(); loadFavourites(); } }) .setNegativeButton(android.R.string.no, null) .show(); } public void loadSchedules() { _swipeRefreshLayout.setRefreshing(true); _adapter.setSchedules(null); DateTimeZone dtz = DateTimeZone.forOffsetMillis(TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings()); LocalDateTime date = LocalDateTime.now(dtz).plusMinutes(-30); SchedulesBusiness.getMultiple(STSBusiness.getConfig(), _adapter.getFavourites(), date, 10) .then(new LuPromise.LuConsumer>() { @Override public void execute(List data) { _adapter.setSchedules(data); _swipeRefreshLayout.setRefreshing(false); } }, new LuPromise.LuConsumer() { @Override public void execute(LuPromise.LuPromiseError data) { Toast.makeText(getContext(), data.getError(), Toast.LENGTH_LONG).show(); _swipeRefreshLayout.setRefreshing(false); } }); } }