package com.bdc.ociney.fragment; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.ActivityOptions; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.RatingBar; import android.widget.TextView; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.bdc.ociney.R; import com.bdc.ociney.activity.MovieActivity; import com.bdc.ociney.activity.StarActivity; import com.bdc.ociney.activity.TheaterDetailMovie; import com.bdc.ociney.adapter.BandesAnnoncesPagerAdapter; import com.bdc.ociney.adapter.BandesAnnoncesPagerAdapter.OnBandeAnnonceClickedListener; import com.bdc.ociney.adapter.ImagesPagerAdapter; import com.bdc.ociney.adapter.ObjectAdapter; import com.bdc.ociney.adapter.ObjectAdapterLayout; import com.bdc.ociney.fragment.core.BetterFragment; import com.bdc.ociney.modele.Media; import com.bdc.ociney.modele.Movie.Movie; import com.bdc.ociney.modele.Person.CastMember; import com.bdc.ociney.modele.Person.PersonFull; import com.bdc.ociney.modele.Theater.Theater; import com.bdc.ociney.task.LoadMovieFullTask; import com.bdc.ociney.task.LoadMovieFullTask.LoadMovieFullTaskCallBack; import com.bdc.ociney.task.LoadShowTimesTask; import com.bdc.ociney.task.SearchTheatersTask; import com.bdc.ociney.utils.LocationUtils; import com.bdc.ociney.utils.actionbar.ActionBarHider; import com.bdc.ociney.utils.transformation.BlurTransformation; import com.bdc.ociney.utils.transformation.CircleTransform; import com.bdc.ociney.utils.transformation.ParallaxTransformer; import com.bdc.ociney.view.CellMember; import com.bdc.ociney.view.CellTheater; import com.bdc.ociney.view.DoubleProgress; import com.bdc.ociney.view.ObservableScrollViewAnimateVisible; import com.bdc.ociney.view.textview.TextViewEx; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import com.squareup.picasso.Picasso; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MovieFragment extends BetterFragment implements ListView.OnItemClickListener, LoadMovieFullTaskCallBack, OnBandeAnnonceClickedListener, LocationUtils.LocationUtilsCallBack, LoadShowTimesTask.LoadShowTimesTaskCallBack, SearchTheatersTask.SearchTheatersTaskCallBack, ObjectAdapter.ObjectAdapterLoadMore { public static final String MOVIE = "movie"; public static final String ACTIONBAR_TITLE = "ACTIONBAR_TITLE"; public String actionbarTitle = ""; Toolbar toolbar; Movie movie; List<Theater> cinemas = new ArrayList<Theater>(); View content; ObservableScrollViewAnimateVisible scrollView; ActionBarHider actionBarHider; SlidingUpPanelLayout slidingDrawer; ImageView imageFond; ViewGroup fragmentLayout; ViewPager viewPager; ImagesPagerAdapter imagesAdapter; BandesAnnoncesPagerAdapter bandesAnnoncesAdapter; View viewTheaters, viewCasting; ListView listTheater, listCasting; ImageView imagePoster; TextView titre; TextView duree; TextView genre; View titreOriginal; View dateDeSortie; TextViewEx synopsis; ViewGroup castingLayout; View realisateurView; View enSalle; TextView enSalleDate; TextView ratingLabel; RatingBar ratingBar; View isVF, is2D, is3D, isVO; List<String> imagesUrl = new ArrayList<String>(); List<String> bandesAnnoncesImagesUrl = new ArrayList<String>(); ObjectAdapter<Theater> theaterAdapter; ViewGroup horairesLayout; DoubleProgress doubleProgress; boolean premierLancement = true; boolean afficherTheaters = false; boolean afficherCasting = false; View horrairesIci; /** * ************ SEARCH THEATERS ******************* */ int page = 1; String texteRecherche; AsyncTask task; boolean vide; boolean recherche = true; public static MovieFragment newInstance(Movie movie) { MovieFragment fragment = new MovieFragment(); Bundle args = new Bundle(); Gson gSon = new Gson(); args.putString(MOVIE, gSon.toJson(movie)); fragment.setArguments(args); return fragment; } public static MovieFragment newInstance(String title, String jsonMovie) { MovieFragment fragment = new MovieFragment(); Bundle args = new Bundle(); args.putString(ACTIONBAR_TITLE, title); args.putString(MOVIE, jsonMovie); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_movie, container, false); setFragmentView(view); toolbar = (Toolbar)((getActivity()).findViewById(R.id.toolbar)); Bundle bundle = getArguments(); if (bundle != null) { if (bundle.containsKey(ACTIONBAR_TITLE)) { actionbarTitle = bundle.getString(ACTIONBAR_TITLE); ((ActionBarActivity)getActivity()).getSupportActionBar().setTitle(actionbarTitle); } if (bundle.containsKey(MOVIE)) { movie = new Gson().fromJson(bundle.getString(MOVIE), new TypeToken<Movie>() { }.getType()); charger(); remplir(); ajouterListeners(); tournerRoulette(true, R.id.placeholder_image_loader); new LoadMovieFullTask(this).execute(movie.getCode().toString()); slidingDrawer.setSlidingEnabled(false); slidingDrawer.collapsePanel(); //actionBarHider.setActionBarTranslation(0);//will "hide" an ActionBar } } return view; } private void changerVueFond(View v) { this.fragmentLayout.removeAllViews(); this.fragmentLayout.addView(v); } public Movie getMovie() { return movie; } public void setMovie(Movie movie) { this.movie = movie; } private void changerVueFond(Fragment f) { this.fragmentLayout.removeAllViews(); FragmentTransaction ft = getChildFragmentManager().beginTransaction(); ft.replace(R.id.fragmentLayout, f); ft.commit(); } private void removeElevation(View view){ view.setElevation(0); if(view instanceof ViewGroup){ ViewGroup viewGroup = (ViewGroup)view; for (int i = 0; i < viewGroup.getChildCount(); i++) { removeElevation(viewGroup.getChildAt(i)); } } } @Override protected void charger() { //this.content = findViewById(R.id.content); actionBarHider = new ActionBarHider(getActivity(), toolbar, R.id.fragmentMovieContent); scrollView = (ObservableScrollViewAnimateVisible) findViewById(R.id.scrollView); slidingDrawer = (SlidingUpPanelLayout) findViewById(R.id.slidingDrawer); /* if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { removeElevation(slidingDrawer); } */ this.imageFond = (ImageView) findViewById(R.id.imageFond); this.fragmentLayout = (ViewGroup) findViewById(R.id.fragmentLayout); this.viewPager = (ViewPager) View.inflate(getActivity(), R.layout.view_pager, null); changerVueFond(viewPager); viewTheaters = View.inflate(getActivity(), R.layout.fragment_movie_theaters, null); listTheater = (ListView) viewTheaters.findViewById(R.id.list); viewCasting = View.inflate(getActivity(), R.layout.fragment_movie_theaters, null); listCasting = (ListView) viewCasting.findViewById(R.id.list); this.imagePoster = (ImageView) findViewById(R.id.imagePoster); this.titre = (TextView) findViewById(R.id.titre); this.duree = (TextView) findViewById(R.id.duree); this.genre = (TextView) findViewById(R.id.genre); this.ratingLabel = (TextView) findViewById(R.id.ratingUserNum); this.ratingBar = (RatingBar) findViewById(R.id.ratingUserStar); this.titreOriginal = findViewById(R.id.titreOriginal); this.dateDeSortie = findViewById(R.id.dateDeSortie); this.synopsis = (TextViewEx) findViewById(R.id.synopsis); this.realisateurView = (ViewGroup) findViewById(R.id.realisateurLayout); this.castingLayout = (ViewGroup) findViewById(R.id.castingLayout); this.enSalle = findViewById(R.id.enSalleLe); this.enSalleDate = (TextView) findViewById(R.id.enSalleLeValue); this.doubleProgress = (DoubleProgress) findViewById(R.id.critiques); isVF = findViewById(R.id.movieVF); is2D = findViewById(R.id.movie2D); is3D = findViewById(R.id.movie3D); isVO = findViewById(R.id.movieVO); horrairesIci = findViewById(R.id.horrairesIci); } @Override protected void remplir() { isVF.setVisibility(View.GONE); is2D.setVisibility(View.GONE); is3D.setVisibility(View.GONE); isVO.setVisibility(View.GONE); if (movie != null) { theaterAdapter = new ObjectAdapter<Theater>(getActivity(), cinemas, R.layout.cell_theater, CellTheater.class); listTheater.setAdapter(theaterAdapter); String poster = this.movie.getUrlPoster(getActivity().getResources().getInteger(R.integer.fragment_movie_fond_blur_height)); if (poster != null) { Picasso.with(getActivity()).load(poster).transform(new BlurTransformation()).into(imageFond); imagesUrl.add(this.movie.getUrlPoster(getActivity().getResources().getInteger(R.integer.fragment_movie_fond_height))); //Picasso.with(getActivity()).load(this.moviePoster).into(imageFond); Picasso.with(getActivity()) .load(this.movie.getUrlPoster(getActivity().getResources().getInteger(R.integer.fragment_movie_poster_height))) .into(imagePoster); } imagesAdapter = new ImagesPagerAdapter(getChildFragmentManager(), getActivity(), imagesUrl); viewPager.setAdapter(imagesAdapter); viewPager.setPageTransformer(false, new ParallaxTransformer(R.id.parallaxContent)); chargerRating(); if (movie.getTitle() != null) titre.setText(movie.getTitle()); duree.setText(movie.getDuree()); genre.setText(movie.getGenres()); if (movie.getOriginalTitle() != null && !(movie.sameTitleAndOrignlalTitle())) { ((TextView) titreOriginal.findViewById(R.id.text)).setText(movie.getOriginalTitle()); } else { titreOriginal.setVisibility(View.GONE); } SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); try { Date date1 = sdf.parse(movie.getRelease().getReleaseDate()); Date date2 = new Date(); if (date1.before(date2)) { ((TextView) dateDeSortie.findViewById(R.id.text)).setText(movie.getRelease().getReleaseDate()); } else dateDeSortie.setVisibility(View.GONE); } catch (Exception e) { Log.e("Erreur date", e.toString()); dateDeSortie.setVisibility(View.GONE); } if (movie.getSynopsisShort() != null) synopsis.setText(movie.getSynopsisShort(), true); doubleProgress.setValeurHaut(movie.getUserRating()); doubleProgress.setValeurBas(movie.getPressRating()); doubleProgress.animer(); if (movie.getHasShowtime() == null || movie.getHasShowtime() != 1) { this.findViewById(R.id.horrairesIci).setVisibility(View.GONE); } } } private void chargerRating() { float rating = (movie.getUserRating() + movie.getPressRating()) / 2; if (rating == 0) { ratingLabel.setVisibility(View.GONE); ratingBar.setVisibility(View.GONE); if (movie.getRelease() != null) { if (movie.getRelease().getReleaseDate() != null && movie.getRelease().getReleaseDate().length() > 0) { enSalle.setVisibility(View.VISIBLE); enSalleDate.setText(movie.getRelease().getReleaseDate()); } else { enSalle.setVisibility(View.GONE); enSalleDate.setVisibility(View.GONE); } findViewById(R.id.critiquesLayout).setVisibility(View.GONE); findViewById(R.id.horrairesLayout).setVisibility(View.GONE); } } else { ratingLabel.setText("(" + String.format("%.1f", rating) + ")"); ratingBar.setRating(rating); ratingBar.setIsIndicator(true); } } private void animerVersionsDisponibles() { List<AnimatorSet> animations = new ArrayList<AnimatorSet>(); boolean[] is = new boolean[]{movie.isVF(), movie.is2D(), movie.is3D(), movie.isVO()}; View[] vs = new View[]{isVF, is2D, is3D, isVO}; int duree = 200; for (int i = 0; i < is.length; ++i) { if (is[i]) { vs[i].setVisibility(View.VISIBLE); vs[i].setAlpha(0); AnimatorSet animatorSetRebond1 = new AnimatorSet(); //animatorSetRebond1.setDuration((int)(duree*0.75f)); animatorSetRebond1.playTogether( ObjectAnimator.ofFloat(vs[i], "translationX", 100, -10), ObjectAnimator.ofFloat(vs[i], "rotation", 0f, -380f) ); AnimatorSet animatorSetRebond2 = new AnimatorSet(); //animatorSetRebond2.setDuration((int)(duree*0.25f)); animatorSetRebond2.playTogether( ObjectAnimator.ofFloat(vs[i], "rotation", -20f, 0f), ObjectAnimator.ofFloat(vs[i], "translationX", -10, 0) ); AnimatorSet animatorSetRebond = new AnimatorSet(); //animatorSetRebond.setDuration((int)duree); animatorSetRebond.playSequentially( animatorSetRebond1, animatorSetRebond2 ); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(duree); animatorSet.setInterpolator(new DecelerateInterpolator(2)); animatorSet.playTogether( ObjectAnimator.ofFloat(vs[i], "alpha", 0, 1f), animatorSetRebond ); animations.add(animatorSet); } } AnimatorSet[] anims = new AnimatorSet[animations.size()]; animations.toArray(anims); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playSequentially(anims); animatorSet.start(); } @Override protected void ajouterListeners() { horrairesIci.setOnClickListener(this); listTheater.setOnItemClickListener(this); slidingDrawer.setPanelSlideListener( new SlidingUpPanelLayout.PanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { try { Field f = slidingDrawer.getClass().getDeclaredField("mSlideOffset"); f.setAccessible(true); float mSlideOffset = f.getFloat(slidingDrawer); if (!premierLancement) { imageFond.setAlpha(mSlideOffset); fragmentLayout.setAlpha(1 - mSlideOffset); } actionBarHider.setActionBarTranslation(-1 * mSlideOffset); } catch (Exception e) { e.printStackTrace(); } } @Override public void onPanelCollapsed(View panel) { if (afficherTheaters) { afficherCinemas(); } if (afficherCasting) { afficherCasting(); afficherCasting = false; } } @Override public void onPanelExpanded(View panel) { premierLancement = false; } @Override public void onPanelAnchored(View panel) { } @Override public void onPanelHidden(View view) { } } ); } //----------CINEMA----------- @Override public void onClick(View v) { switch (v.getId()) { case R.id.horrairesIci: this.lancerHorrairesIci(v.findViewById(R.id.img_ici), true); break; case R.id.realisateurLayout: // StarFragment.personId = movie.getRealisateur().getPerson().getCode().toString(); PersonFull person = PersonFull.transformFull(movie.getRealisateur().getPerson()); Intent intentRealisateur = new Intent(getActivity(), StarActivity.class); intentRealisateur.putExtra(StarFragment.PERSON, (new Gson()).toJson(person)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { Bundle b = ActivityOptions.makeScaleUpAnimation(v.findViewById(R.id.realisateurImage), 0, 0, 100, 100).toBundle(); getActivity().startActivity(intentRealisateur, b); } else startActivity(intentRealisateur); break; case R.id.castingPlus: afficherCasting = true; ((MovieActivity) getActivity()).afficherCasting(); slidingDrawer.collapsePanel(); //afficherCasting(); /* ListCastingFragment.casting = movie.getAllCastMember(); ListCastingFragment.movie = this.movie; Intent intentCasting = new Intent(getActivity(), MovieCastingActivity.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { Bundle b = ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getWidth(), v.getHeight()).toBundle(); getActivity().startActivity(intentCasting, b); } else startActivity(intentCasting); */ break; } } @Override public void onBandeAnnonceClicked(Media bandeAnnonce) { String videoPath = ""; videoPath = bandeAnnonce.getRendition().get(0).getHref(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(videoPath), "video/mp4"); startActivity(intent); } // Lorsque le chargement asynchrone du film a finit public void onLoadMovieFullTaskCallBack(Movie movie) { MovieFragment.this.movie = movie; if (movie == null) return; tournerRoulette(false, R.id.placeholder_image_loader); synopsis.setText(movie.getSynopsis(), true); List<String> urlsImages = movie.getUrlImages(getActivity().getResources().getInteger(R.integer.fragment_movie_fond_height)); if (urlsImages != null && urlsImages.size() > 0) { imagesUrl.addAll(urlsImages); imagesAdapter.notifyDataSetChanged(); } new ObjectAdapterLayout<CastMember>(getActivity(), movie.getCastMember(3), R.layout.casting_member, CellMember.class, castingLayout); CastMember realisateur = movie.getRealisateur(); if (realisateur == null) realisateurView.setVisibility(View.GONE); else { ((TextView) realisateurView.findViewById(R.id.realisateurNom)).setText(realisateur.getPerson().getName()); realisateurView.setOnClickListener(this); ImageView imageRealisateur = (ImageView) realisateurView.findViewById(R.id.realisateurImage); if (realisateur.getPicture() != null && realisateur.getPicture().getHref(0) != null) { String pictureRealisateur = realisateur.getPicture().getHref(getActivity().getResources().getInteger(R.integer.fragment_movie_realisateur_height)); Picasso.with(getActivity()).load(pictureRealisateur).transform(new CircleTransform()).into(imageRealisateur); } else realisateurView.setVisibility(View.GONE); } View.inflate(getActivity(), R.layout.casting_plus, castingLayout); findViewById(R.id.castingPlus).setOnClickListener(this); //ajout du "Plus" bandesAnnoncesAdapter = new BandesAnnoncesPagerAdapter(getActivity(), getChildFragmentManager(), movie.getBandesAnnonces(), movie, this, false); animerVersionsDisponibles(); ObjectAdapter castingAdapter = new ObjectAdapter<CastMember>(getActivity(), movie.getAllCastMember(), R.layout.casting_member, CellMember.class); listCasting.addFooterView(View.inflate(getActivity(),R.layout.cell_theater_empty,null)); listCasting.setAdapter(castingAdapter); slidingDrawer.postDelayed(new Runnable() { @Override public void run() { slidingDrawer.setSlidingEnabled(true); slidingDrawer.expandPanel(); scrollView.start(); } }, 3000); } public void afficherImages() { if (imagesAdapter != null) viewPager.setAdapter(imagesAdapter); viewPager.getAdapter().notifyDataSetChanged(); slidingDrawer.collapsePanel(); } public void afficherBandesAnnonces() { if (bandesAnnoncesAdapter != null) viewPager.setAdapter(bandesAnnoncesAdapter); viewPager.getAdapter().notifyDataSetChanged(); slidingDrawer.collapsePanel(); } public void lancerHorrairesIci(final View v, final boolean ici) { AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(600); animatorSet.playTogether( ObjectAnimator.ofFloat(v, "alpha", 1, 0), ObjectAnimator.ofFloat(v, "scaleX", 1, 1.5f), ObjectAnimator.ofFloat(v, "scaleY", 1, 1.5f) ); animatorSet.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { AnimatorSet animatorSetReverse = new AnimatorSet(); animatorSetReverse.setDuration(300); animatorSetReverse.playTogether( ObjectAnimator.ofFloat(v, "alpha", 0, 1), ObjectAnimator.ofFloat(v, "scaleX", 1.5f, 1f), ObjectAnimator.ofFloat(v, "scaleY", 1.5f, 1f) ); animatorSetReverse.start(); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); animatorSet.start(); //1: demande la localisation new LocationUtils(getActivity(), this).chercherLocation(); } @Override public void onLocationFound(String lng, String lat) { //2: demande les cinemas new LoadShowTimesTask(this).execute(movie, lat, lng); } @Override public void onGPSNotFound() { /* Crouton.makeText(getActivity(), R.string.erreur_gps, new Style.Builder().setBackgroundColor(R.color.black50).build() ).show();*/ viewTheaters.findViewById(R.id.list_theater_empty).setVisibility(View.VISIBLE); onLoadShowTimesTaskCallBack(new ArrayList<Theater>()); } @Override public void onLoadShowTimesTaskCallBack(List<Theater> result) { try { //3: charge les cinemas cinemas.clear(); cinemas.addAll(result); listTheater.addFooterView(View.inflate(getActivity(),R.layout.cell_theater_empty,null)); theaterAdapter.notifyDataSetChanged(); slidingDrawer.collapsePanel(); //4: demande l'affichage de la liste après la fermeture du collapse afficherTheaters = true; } catch (Exception e) { } } private void afficherCinemas() { //5: appellé après le collapse changerVueFond(viewTheaters); slidingDrawer.setSlidingEnabled(false); ((ActionBarActivity)getActivity()).getSupportActionBar().setTitle(R.string.projections); afficherTheaters = false; ((MovieActivity) getActivity()).afficherCinema(); } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Theater theater = (Theater) theaterAdapter.getItem(i); Intent intent = new Intent(getActivity(), TheaterDetailMovie.class); intent.putExtra(TheaterDetailMovie.MOVIE, (new Gson()).toJson(movie)); intent.putExtra(TheaterDetailMovie.THEATER, (new Gson()).toJson(theater)); startActivity(intent); getActivity().overridePendingTransition(0, 0); } public void fermerCinema() { slidingDrawer.setSlidingEnabled(true); changerVueFond(viewPager); ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(actionbarTitle); slidingDrawer.expandPanel(); } private void afficherCasting() { //5: appellé après le collapse changerVueFond(viewCasting); slidingDrawer.setSlidingEnabled(false); ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(R.string.casting_complet); ((MovieActivity) getActivity()).afficherCasting(); } public void fermerCasting() { fermerCinema(); } @Override public void search(String text) { super.search(text); this.texteRecherche = text; cinemas.clear(); this.theaterAdapter.notifyDataSetChanged(); theaterAdapter.listener = this; viewTheaters.findViewById(R.id.list_theater_empty).setVisibility(View.VISIBLE); if (task == null) { task = new SearchTheatersTask(this, movie); task.execute(text); } } @Override public void onSearchTheatersTaskCallBack(List<Theater> ths) { viewTheaters.findViewById(R.id.list_theater_empty).setVisibility(View.GONE); if (this.cinemas.isEmpty()) { theaterAdapter.notifyDataSetChanged(); } task = null; if (ths.isEmpty() && this.cinemas.isEmpty()) { afficherVide(true); vide = true; theaterAdapter.listener = null; } else afficherVide(false); if (ths.isEmpty()) { vide = true; theaterAdapter.listener = null; } else { try { this.cinemas.addAll(ths); theaterAdapter.notifyDataSetChanged(); } catch (Exception e) { theaterAdapter.listener = null; } } } @Override public void loadMore() { page++; if (recherche && !vide && task == null) { task = new SearchTheatersTask(this, movie); task.execute(texteRecherche, page); } } }