package fr.eyal.datalib.sample.netflix.fragment; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.ImageView; import android.widget.ScrollView; import android.widget.TextView; import fr.eyal.datalib.sample.netflix.MovieActivity; import fr.eyal.datalib.sample.netflix.R; import fr.eyal.datalib.sample.netflix.data.model.cast.Cast; import fr.eyal.datalib.sample.netflix.data.model.cast.CastPerson; import fr.eyal.datalib.sample.netflix.data.model.movie.Movie; import fr.eyal.datalib.sample.netflix.data.model.movie.MovieCategory; import fr.eyal.datalib.sample.netflix.data.model.movieimage.MovieImage; import fr.eyal.datalib.sample.netflix.data.model.synopsis.Synopsis; import fr.eyal.datalib.sample.netflix.data.service.NetflixService; import fr.eyal.datalib.sample.netflix.fragment.model.MovieItem; import fr.eyal.datalib.sample.netflix.util.Util; import fr.eyal.lib.data.model.ResponseBusinessObject; import fr.eyal.lib.data.service.DataManager; import fr.eyal.lib.data.service.model.BusinessResponse; import fr.eyal.lib.data.service.model.DataLibRequest; public class MovieFragment extends NetflixFragment { MovieItem mMovieItem; Movie mMovie; Synopsis mSynopsis; Cast mCast; TextView mTxtTitle; TextView mTxtCategory; TextView mTxtYear; TextView mTxtTime; TextView mTxtSynopsis; TextView mTxtCast1; TextView mTxtCast2; ImageView mImage; String mDataType; Bitmap mBitmap; @Override public void onCreate(Bundle savedInstanceState) { Bundle extras = getActivity().getIntent().getExtras(); mMovieItem = (MovieItem) extras.get(MovieActivity.EXTRA_MOVIE); super.onCreate(savedInstanceState); setRetainInstance(true); if(mMovieItem.getLabel(-1).contains("Season")) mDataType = "series"; else mDataType = "movies"; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ScrollView scrollView = (ScrollView) inflater.inflate(R.layout.fgmt_movie, null, false); mTxtCast1 = (TextView) scrollView.findViewById(R.id.cast1); mTxtCast2 = (TextView) scrollView.findViewById(R.id.cast2); mTxtCategory = (TextView) scrollView.findViewById(R.id.category); mTxtSynopsis = (TextView) scrollView.findViewById(R.id.synopsis_content); mTxtTime = (TextView) scrollView.findViewById(R.id.time); mTxtTitle = (TextView) scrollView.findViewById(R.id.title); mTxtYear = (TextView) scrollView.findViewById(R.id.year); mImage = (ImageView) scrollView.findViewById(R.id.image); Bitmap bmp = null; if(mBitmap != null) { mImage.setImageDrawable(new BitmapDrawable(getResources(), mBitmap)); bmp = mBitmap; } else { if(mMovieItem != null) { mTxtTitle.setText(mMovieItem.getLabel(-1)); bmp = mMovieItem.getPoster(false); } if(bmp != null) { mBitmap = bmp; // Init RS variables // mInBitmap = bmp; // mOutBitmap = bmp.copy(bmp.getConfig(), true); float width = getResources().getDimension(R.dimen.movie_image_width); float height = width * bmp.getHeight() / bmp.getWidth(); Util.scaleBitmap(bmp, width, height, Util.ScalingLogic.FIT); mImage.setImageDrawable(new BitmapDrawable(getResources(), bmp)); } } if(bmp == null || bmp.getWidth() < mImage.getHeight()){ try { int id = mDataManager.getMovieImage(DataManager.TYPE_CACHE, this, mMovieItem.getImageUrl(), DataLibRequest.OPTION_NO_OPTION, null, null); synchronized (mRequestIds){ mRequestIds.add(id); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } int movieId = Integer.parseInt(mMovieItem.getId()); if(mMovie != null){ updateBasics(mMovie); } else { try { int id = mDataManager.getMovie(DataManager.TYPE_CACHE, this, mDataType, movieId, DataLibRequest.OPTION_NO_OPTION, null, null); synchronized (mRequestIds){ mRequestIds.add(id); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } if(mSynopsis != null) { updateSynopsis(mSynopsis); } else { try { int id = mDataManager.getSynopsis(DataManager.TYPE_CACHE, this, movieId, DataLibRequest.OPTION_NO_OPTION, null, null); synchronized (mRequestIds){ mRequestIds.add(id); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } if(mCast != null) { updateCast(mCast); } else { try { int id = mDataManager.getCast(DataManager.TYPE_CACHE, this, movieId, DataLibRequest.OPTION_NO_OPTION, null, null); synchronized (mRequestIds){ mRequestIds.add(id); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return scrollView; } @Override public void onCacheRequestFinished(int requestId, ResponseBusinessObject response) { synchronized (mRequestIds) { mRequestIds.remove(Integer.valueOf(requestId)); mDataManager.removeOnDataListener(requestId, this); if(response instanceof MovieImage){ MovieImage movieImage = (MovieImage) response; if(movieImage.image != null) { Bitmap bmp = movieImage.image.get(); if(bmp != null) getActivity().runOnUiThread(new UpdatePoster(bmp, mImage)); } else { try { int id = mDataManager.getMovieImage(DataManager.TYPE_NETWORK, this, mMovieItem.getImageUrl(), DataLibRequest.OPTION_NO_OPTION, null, null); mRequestIds.add(id); } catch (NumberFormatException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } else if(response instanceof Movie){ Movie movie = (Movie) response; if(!movie.isInvalidID()){ mMovie = movie; getActivity().runOnUiThread(new UpdateContent(mMovie)); } else { try { int id = mDataManager.getMovie(DataManager.TYPE_NETWORK, this, mDataType, Integer.parseInt(mMovieItem.getId()), DataLibRequest.OPTION_NO_OPTION, null, null); mRequestIds.add(id); } catch (NumberFormatException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } else if(response instanceof Synopsis) { Synopsis synopsis = (Synopsis) response; if(!synopsis.isInvalidID()){ mSynopsis = synopsis; getActivity().runOnUiThread(new UpdateContent(mSynopsis)); } else { try { int id = mDataManager.getSynopsis(DataManager.TYPE_NETWORK, this, Integer.parseInt(mMovieItem.getId()), DataLibRequest.OPTION_NO_OPTION, null, null); mRequestIds.add(id); } catch (NumberFormatException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } else if(response instanceof Cast) { Cast cast = (Cast) response; if(!cast.isInvalidID()){ mCast = cast; getActivity().runOnUiThread(new UpdateContent(mCast)); } else { try { int id = mDataManager.getCast(DataManager.TYPE_NETWORK, this, Integer.parseInt(mMovieItem.getId()), DataLibRequest.OPTION_NO_OPTION, null, null); mRequestIds.add(id); } catch (NumberFormatException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } } } @Override public void onDataFromDatabase(int code, ArrayList<?> data) { // TODO Auto-generated method stub } @Override public void onRequestFinished(int requestId, boolean suceed, BusinessResponse response) { synchronized (mRequestIds) { mRequestIds.remove(Integer.valueOf(requestId)); mDataManager.removeOnDataListener(requestId, this); } if(!suceed){ // if(response.response instanceof ResponseBusinessObjectDAO){ // try { // int id = mDataManager.getMovie(DataManager.TYPE_NETWORK, this, mDataType, Integer.parseInt(mMovieItem.getId()), DataLibRequest.OPTION_NO_OPTION, null, null); // mRequestIds.add(id); // // } catch (NumberFormatException e) { // e.printStackTrace(); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } // } // return; } switch (response.webserviceType) { case NetflixService.WEBSERVICE_MOVIE: Movie movie = (Movie) response.response; getActivity().runOnUiThread(new UpdateContent(movie)); break; case NetflixService.WEBSERVICE_SYNOPSIS: Synopsis synopsis = (Synopsis) response.response; getActivity().runOnUiThread(new UpdateContent(synopsis)); break; case NetflixService.WEBSERVICE_CAST: Cast cast = (Cast) response.response; getActivity().runOnUiThread(new UpdateContent(cast)); break; default: break; } } public class UpdatePoster implements Runnable { Bitmap mImage; ImageView mView; Animation mFadeIn; public UpdatePoster(Bitmap image, ImageView view){ mImage = image; mView = view; mFadeIn = new AlphaAnimation(0, 1); mFadeIn.setDuration(300); } @Override public void run() { Animation anim = mView.getAnimation(); if(anim != null){ anim.cancel(); anim.reset(); mView.setImageBitmap(mImage); anim.startNow(); } else { mView.setImageBitmap(mImage); mView.startAnimation(mFadeIn); } } } public class UpdateContent implements Runnable { Movie mMovie; Synopsis mSynopsis; Cast mCast; public UpdateContent(Movie movie){ mMovie = movie; } public UpdateContent(Synopsis synopsis){ mSynopsis = synopsis; } public UpdateContent(Cast cast){ mCast = cast; } @Override public void run() { if(mMovie != null) { updateBasics(mMovie); } if(mSynopsis != null) { updateSynopsis(mSynopsis); } if(mCast != null) { updateCast(mCast); } } } private void updateSynopsis(Synopsis synopsis) { if(synopsis != null && synopsis.synopsis != null) mTxtSynopsis.setText(Html.fromHtml(synopsis.synopsis)); } private void updateCast(Cast cast) { if(cast != null && cast.castPerson != null){ ArrayList<CastPerson> persons = cast.castPerson; int size = persons.size(); if(size > 10) size = 10; StringBuilder builderLeft = new StringBuilder(); StringBuilder builderRight = new StringBuilder(); StringBuilder builder = builderLeft; for (int i = 0; i < size; i++) { CastPerson person = persons.get(i); if(i%2 == 0) builder = builderLeft; else builder = builderRight; if(i > 1) builder.append('\n'); builder.append(person.name); } if(size%2 == 1) builderRight.append('\n'); mTxtCast1.setText(builderLeft); mTxtCast2.setText(builderRight); } } private void updateBasics(Movie movie) { if(mTxtTitle.getText().length() < movie.attrTitleRegular.length()) mTxtTitle.setText(movie.attrTitleRegular); if(movie.release_year > 0) mTxtYear.setText(""+movie.release_year); else mTxtYear.setText("N.C."); int runtime = movie.runtime; // int hours = runtime/3600; int minutes = runtime/60; //(runtime%3600)/60; int seconds = runtime%60; StringBuilder builder = new StringBuilder(); // if(hours > 0){ // builder.append(hours); // builder.append("h "); // } // if(hours > 0 || minutes > 0) { // builder.append(minutes); // builder.append("m "); // } // if(hours <= 0) { // builder.append(seconds); // builder.append("s"); // } if(minutes > 0) { builder.append(minutes); builder.append(" minutes"); } else if(seconds > 0) { builder.append(seconds); builder.append(" seconds"); } else { builder.append("N.C."); } mTxtTime.setText(builder.toString()); ArrayList<MovieCategory> categories = movie.movieCategory; if(categories != null) { if(categories.size() > 1) mTxtCategory.setText(categories.get(1).attrLabel); else mTxtCategory.setText(""); } } }