package com.bdc.ociney.fragment;
import android.app.ActivityOptions;
import android.content.Intent;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.bdc.ociney.R;
import com.bdc.ociney.activity.AppFragmentActivity;
import com.bdc.ociney.activity.MovieActivity;
import com.bdc.ociney.adapter.ObjectAdapter;
import com.bdc.ociney.fragment.core.BetterFragment;
import com.bdc.ociney.modele.Movie.Movie;
import com.bdc.ociney.task.LoadMoviesFavorisTask;
import com.bdc.ociney.task.LoadMoviesTask;
import com.bdc.ociney.task.SearchMoviesTask;
import com.bdc.ociney.view.CellMovie;
import com.bdc.ociney.view.ViewCell;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.List;
public class ListMoviesFragment extends BetterFragment implements AbsListView.OnScrollListener, LoadMoviesFavorisTask.LoadMoviesFavorisTaskCallBack, AdapterView.OnItemClickListener, ObjectAdapter.ObjectAdapterLoadMore, SearchMoviesTask.SearchMoviesTaskCallBack, LoadMoviesTask.LoadMoviesTaskCallBack {
public static final String MOVIES = "movies";
public static final String FAVORIS = "favoris";
public static final String NOW_SHOWING = "nowshowing";
public static final String FAVORIS_STRINGS = "favoris_string";
static int MOVIE_CELL_IMAGE_FOND_HEIGHT;
static int MOVIE_PARALLAX_SPEED = 100;
public int page = 1;
List<Movie> movies;
ObjectAdapter<Movie> adapter;
AbsListView list;
AsyncTask task = null;
View top = null;
boolean recherche = false;
boolean favoris = false;
String texteRecherche = "";
boolean nowshowing = false;
boolean vide = false;
public ListMoviesFragment() {
}
public static ListMoviesFragment newInstance(List<Movie> movies, boolean nowShowing) {
ListMoviesFragment fragment = new ListMoviesFragment();
Bundle args = new Bundle();
Gson gSon = new Gson();
args.putString(MOVIES, gSon.toJson(movies));
args.putBoolean(NOW_SHOWING, nowShowing);
fragment.setArguments(args);
return fragment;
}
public static ListMoviesFragment newInstance(List<String> films) { //dans le cas des favoris
ListMoviesFragment fragment = new ListMoviesFragment();
Bundle args = new Bundle();
Gson gSon = new Gson();
args.putBoolean(FAVORIS, true);
args.putString(FAVORIS_STRINGS, gSon.toJson(films));
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list,
container, false);
setFragmentView(view);
Bundle bundle = getArguments();
if (bundle != null) {
if (bundle.containsKey(FAVORIS)) {
favoris = true;
movies = new ArrayList<Movie>();
Gson gSon = new Gson();
List<String> films = gSon.fromJson(bundle.getString(FAVORIS_STRINGS), new TypeToken<List<String>>() {
}.getType());
if (films.size() > 0) {
super.tournerRoulette(true);
new LoadMoviesFavorisTask(this).execute(films);
} else
afficherVide(true);
} else if (bundle.containsKey(MOVIES)) {
Gson gSon = new Gson();
nowshowing = bundle.getBoolean(NOW_SHOWING);
movies = gSon.fromJson(bundle.getString(MOVIES), new TypeToken<List<Movie>>() {
}.getType());
}
}
MOVIE_CELL_IMAGE_FOND_HEIGHT = (int) getActivity().getResources().getDimension(R.dimen.cell_movie_image_fond_height);
charger();
remplir();
ajouterListeners();
refreshAdapter(movies);
return view;
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
protected void charger() {
View v = View.inflate(getActivity(), R.layout.list, null);
list = (AbsListView) v.findViewById(R.id.list);
((ViewGroup) fragmentView).addView(v);
}
@Override
protected void remplir() {
adapter = new ObjectAdapter<Movie>(getActivity(), movies, R.layout.cell_movie, CellMovie.class);
if (!favoris)
adapter.listener = this;
list.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
protected void ajouterListeners() {
list.setOnItemClickListener(this);
list.setOnScrollListener(this);
}
public void onClick(View v) {
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Movie movie = (Movie) adapter.getItem(i);
Intent intent = new Intent(getActivity(), MovieActivity.class);
intent.putExtra(MovieFragment.ACTIONBAR_TITLE, AppFragmentActivity.actionBarSubTitle);
intent.putExtra(MovieFragment.MOVIE, (new Gson()).toJson(movie));
Bundle b = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
b = ActivityOptions.makeScaleUpAnimation(view, 0, 0, view.getWidth(), view.getHeight()).toBundle();
getActivity().startActivity(intent, b);
} else {
getActivity().startActivity(intent);
getActivity().overridePendingTransition(0, 0);
}
}
public void refreshAdapter(List<Movie> movies) {
ViewGroup p = (ViewGroup) this.list.getParent();
p.removeView(list);
this.movies = movies;
page = 1;
charger();
remplir();
ajouterListeners();
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (view.getChildCount() == 0)
return;
int first = 0;
if (top == null)
top = view.getChildAt(first);
//GFloat yOffset = ((self.parallaxCollectionView.contentOffset.y
int last = first + visibleItemCount;
float centerY = view.getMeasuredHeight() / 2 + view.getTop();
for (int i = first; i < last; ++i) {
View viewCell = view.getChildAt(i);
if(viewCell != null && viewCell.getTag()!=null) {
ViewCell cell = (ViewCell) viewCell.getTag();
Rect rect = new Rect();
viewCell.getGlobalVisibleRect(rect);
float diffCenter = (centerY - rect.top);
float yOffset = diffCenter / MOVIE_CELL_IMAGE_FOND_HEIGHT;
if (yOffset > 1)
yOffset = 1;
if (yOffset < -1)
yOffset = -1;
cell.onScroll((-1f + yOffset) * MOVIE_PARALLAX_SPEED);
}
}
}
@Override
public void search(String text) {
texteRecherche = Normalizer.normalize(text, Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
if (task == null && text != null && !text.isEmpty()) {
task = new SearchMoviesTask(this).execute(texteRecherche);
refreshAdapter(new ArrayList<Movie>());
recherche = true;
}
}
@Override
public void onSearchMoviesTaskTaskCallBack(final List<Movie> ms) {
if (ms.isEmpty() && movies.isEmpty()) {
afficherVide(true);
vide = true;
adapter.listener = null;
}
else
afficherVide(false);
if (ms.isEmpty()) {
vide = true;
adapter.listener = null;
}
if (ms.size() == 0) //si plus de resultats, on enleve le loadmore
adapter.listener = null;
else {
list.post(
new Runnable() {
@Override
public void run() {
movies.addAll(ms);
adapter.notifyDataSetChanged();
}
}
);
}
task = null;
}
@Override
public void loadMore() {
page++;
if (recherche && !vide)
task = new SearchMoviesTask(this).execute(texteRecherche, page);
else
new LoadMoviesTask(this).execute(page);
}
@Override
public void onLoadMoviesTaskCallBack(final ArrayList<List<Movie>> ms) {
try {
list.post(
new Runnable() {
@Override
public void run() {
AppFragmentActivity.moviesNowShowing.addAll(ms.get(0));
AppFragmentActivity.moviesCommingSoon.addAll(ms.get(1));
if (nowshowing)
movies.addAll(ms.get(0));
else
movies.addAll(ms.get(1));
adapter.notifyDataSetChanged();
}
}
);
} catch (Exception e) {
e.printStackTrace();
adapter.listener = null;
}
}
@Override
public void onLoadMoviesFavorisTaskCallBack(List<Movie> ms) {
if (ms.isEmpty() && movies.isEmpty())
afficherVide(true);
else
afficherVide(false);
movies.addAll(ms);
adapter.notifyDataSetChanged();
tournerRoulette(false);
}
}