/**
* Copyright (C) 2013 Romain Guefveneu.
*
* This file is part of naonedbus.
*
* Naonedbus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Naonedbus is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.naonedbus.fragment.impl;
import java.util.ArrayList;
import java.util.List;
import net.naonedbus.NBApplication;
import net.naonedbus.R;
import net.naonedbus.activity.impl.CommentaireActivity;
import net.naonedbus.activity.impl.MapActivity;
import net.naonedbus.activity.impl.PlanActivity;
import net.naonedbus.activity.map.overlay.TypeOverlayItem;
import net.naonedbus.bean.Arret;
import net.naonedbus.bean.Favori;
import net.naonedbus.bean.Ligne;
import net.naonedbus.bean.Sens;
import net.naonedbus.card.Card;
import net.naonedbus.card.impl.CommentairesCard;
import net.naonedbus.card.impl.HoraireCard;
import net.naonedbus.card.impl.MapCard;
import net.naonedbus.card.impl.TraficCard;
import net.naonedbus.manager.impl.ArretManager;
import net.naonedbus.manager.impl.FavoriManager;
import net.naonedbus.manager.impl.SensManager;
import net.naonedbus.provider.impl.NaoLocationManager;
import org.joda.time.DateMidnight;
import android.animation.LayoutTransition;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LayoutAnimationController;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
public class ArretDetailFragment extends SherlockFragment {
public static interface OnSensChangeListener {
void onSensChange(Sens newSens);
}
public static interface OnArretChangeListener {
void onArretChange(Arret newArret);
}
public static final String PARAM_LIGNE = "ligne";
public static final String PARAM_SENS = "sens";
public static final String PARAM_ARRET = "arret";
private Ligne mLigne;
private Sens mSens;
private Arret mArret;
private final ArretManager mArretManager;
private final SensManager mSensManager;
private final FavoriManager mFavoriManager;
private final List<OnSensChangeListener> mOnSensChangeListeners;
private OnArretChangeListener mOnArretChangeListener;
private ViewGroup mViewGroup;
private final List<Card<?>> mCards;
public ArretDetailFragment() {
mFavoriManager = FavoriManager.getInstance();
mArretManager = ArretManager.getInstance();
mSensManager = SensManager.getInstance();
mCards = new ArrayList<Card<?>>();
mOnSensChangeListeners = new ArrayList<ArretDetailFragment.OnSensChangeListener>();
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLigne = getArguments().getParcelable(PARAM_LIGNE);
mSens = getArguments().getParcelable(PARAM_SENS);
mArret = getArguments().getParcelable(PARAM_ARRET);
setHasOptionsMenu(true);
final HoraireCard horaireCard = new HoraireCard(getActivity(), getLoaderManager(), getChildFragmentManager(),
mArret);
final TraficCard traficCard = new TraficCard(getActivity(), getLoaderManager(), getChildFragmentManager(),
mLigne);
final CommentairesCard commentairesCard = new CommentairesCard(getActivity(), getLoaderManager(),
getChildFragmentManager());
commentairesCard.setLigne(mLigne);
commentairesCard.setSens(mSens);
commentairesCard.setArret(mArret);
// final MapCard mapCard = new MapCard(getActivity(),
// getLoaderManager(), getChildFragmentManager(),
// mArret.getLatitude(), mArret.getLongitude());
// final NaoLocationManager locationProvider =
// NBApplication.getLocationProvider();
// mapCard.setCurrentLocation(locationProvider.getLastLocation());
mCards.add(horaireCard);
mCards.add(traficCard);
mCards.add(commentairesCard);
// mCards.add(mapCard);
mOnArretChangeListener = horaireCard;
mOnSensChangeListeners.add(commentairesCard);
}
@Override
public void onAttach(final Activity activity) {
super.onAttach(activity);
mOnSensChangeListeners.add((OnSensChangeListener) activity);
}
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.fragment_arret_detail, menu);
final MenuItem menuFavori = menu.findItem(R.id.menu_favori);
final int icon = isFavori() ? R.drawable.ic_star : R.drawable.ic_star_outline;
menuFavori.setIcon(icon);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(final Menu menu) {
final MenuItem menuFavori = menu.findItem(R.id.menu_favori);
final int icon = isFavori() ? R.drawable.ic_star : R.drawable.ic_star_outline;
menuFavori.setIcon(icon);
super.onPrepareOptionsMenu(menu);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
if (container == null) // must put this in
return null;
final View view = inflater.inflate(R.layout.fragment_arret_detail, container, false);
mViewGroup = (ViewGroup) view.findViewById(android.R.id.content);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
final LayoutTransition layoutTransition = mViewGroup.getLayoutTransition();
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
}
final Animation slide = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_from_bottom);
final LayoutAnimationController controller = new LayoutAnimationController(slide);
controller.setInterpolator(new DecelerateInterpolator());
controller.setDelay(0.1f);
mViewGroup.setLayoutAnimation(controller);
return view;
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
for (final Card<?> card : mCards) {
mViewGroup.addView(card.getView(mViewGroup));
}
}
@Override
public void onStart() {
super.onStart();
for (final Card<?> card : mCards) {
card.setContext(getActivity());
card.onStart();
}
}
@Override
public void onResume() {
super.onResume();
for (final Card<?> card : mCards) {
card.onResume();
}
}
@Override
public void onPause() {
for (final Card<?> card : mCards) {
card.onPause();
}
super.onPause();
}
@Override
public void onStop() {
for (final Card<?> card : mCards) {
card.onStop();
}
super.onStop();
}
@Override
public void onDestroy() {
for (final Card<?> card : mCards) {
card.onDestroy();
}
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_favori:
onStarClick();
break;
case R.id.menu_place:
showArretPlan();
break;
case R.id.menu_comment:
menuComment();
break;
case R.id.menu_show_plan:
menuShowPlan();
break;
case R.id.menu_sens:
menuChangeSens();
break;
default:
break;
}
return false;
}
private boolean isFavori() {
final Favori item = mFavoriManager.getSingle(getActivity().getContentResolver(), mArret.getId());
return (item != null);
}
@SuppressLint("NewApi")
private void onStarClick() {
if (isFavori()) {
removeFromFavoris();
Toast.makeText(getActivity(), R.string.toast_favori_retire, Toast.LENGTH_SHORT).show();
} else {
addToFavoris();
Toast.makeText(getActivity(), R.string.toast_favori_ajout, Toast.LENGTH_SHORT).show();
}
getSherlockActivity().invalidateOptionsMenu();
}
private void addToFavoris() {
mFavoriManager.addFavori(getActivity().getContentResolver(), mArret);
}
private void removeFromFavoris() {
mFavoriManager.removeFavori(getActivity().getContentResolver(), mArret.getId());
}
protected void showArretPlan() {
final Intent intent = new Intent(getActivity(), MapActivity.class);
intent.putExtra(MapFragment.PARAM_ITEM_ID, mArret.getIdStation());
intent.putExtra(MapFragment.PARAM_ITEM_TYPE, TypeOverlayItem.TYPE_STATION.getId());
startActivity(intent);
}
private void menuComment() {
final Intent intent = new Intent(getActivity(), CommentaireActivity.class);
intent.putExtra(CommentaireActivity.PARAM_LIGNE, mLigne);
intent.putExtra(CommentaireActivity.PARAM_SENS, mSens);
intent.putExtra(CommentaireActivity.PARAM_ARRET, mArret);
startActivity(intent);
}
private void menuShowPlan() {
final Intent intent = new Intent(getActivity(), PlanActivity.class);
intent.putExtra(PlanActivity.PARAM_CODE_LIGNE, mLigne.getCode());
startActivity(intent);
}
@SuppressLint("NewApi")
private void menuChangeSens() {
Sens autreSens = null;
// Inverser le sens
final List<Sens> sens = mSensManager.getAll(getActivity().getContentResolver(), mLigne.getCode());
for (final Sens sensItem : sens) {
if (sensItem._id != mSens._id) {
autreSens = sensItem;
break;
}
}
if (autreSens != null) {
// Chercher l'arrĂȘt dans le nouveau sens
final Arret arret = mArretManager.getSingle(getActivity().getContentResolver(), mLigne.getCode(),
autreSens.code, mArret.getNormalizedNom());
if (arret != null) {
mSens = autreSens;
mArret = arret;
for (final OnSensChangeListener listener : mOnSensChangeListeners) {
listener.onSensChange(mSens);
}
mOnArretChangeListener.onArretChange(mArret);
getSherlockActivity().invalidateOptionsMenu();
return;
}
}
Toast.makeText(getActivity(), getString(R.string.toast_autre_sens), Toast.LENGTH_SHORT).show();
}
/**
* Clear data and reload with a new date
*
* @param date
*/
public void changeDate(final DateMidnight date) {
}
}