package fr.eyal.datalib.sample.netflix.fragment;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Calendar;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import fr.eyal.datalib.sample.cache.BitmapMemoryLruCache;
import fr.eyal.datalib.sample.cache.CacheableBitmapDrawable;
import fr.eyal.datalib.sample.netflix.MovieActivity;
import fr.eyal.datalib.sample.netflix.R;
import fr.eyal.datalib.sample.netflix.data.model.top100.ItemTop100;
import fr.eyal.datalib.sample.netflix.data.model.top100.Top100;
import fr.eyal.datalib.sample.netflix.data.service.NetflixService;
import fr.eyal.datalib.sample.netflix.fragment.model.MovieItem;
import fr.eyal.datalib.sample.netflix.ui.GridLayout;
import fr.eyal.datalib.sample.netflix.ui.MovieItemHolder;
import fr.eyal.datalib.sample.netflix.util.Resources;
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;
import fr.eyal.lib.util.Out;
public class SelectionFragment extends NetflixFragment implements OnClickListener{
public static final String TAG = SelectionFragment.class.getSimpleName();
ArrayList<MovieItemHolder> mMovies = new ArrayList<MovieItemHolder>();
ImageView mNetflixItem;
Top100 mCurrentTop;
BitmapMemoryLruCache mBitmapCache;
@Override
public void onCreate(Bundle savedInstanceState) {
setRetainInstance(true);
mBitmapCache = Resources.getInstance().mBitmapCache;
super.onCreate(savedInstanceState);
//we ask for the selection content
try {
int requestId = mDataManager.getTop100(DataManager.TYPE_CACHE, this, DataLibRequest.OPTION_NO_OPTION, null, null);
mRequestIds.add(requestId);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ScrollView contentView = (ScrollView) inflater.inflate(R.layout.fgmt_selection, null, false);
GridLayout selectionLayout = (GridLayout) contentView.findViewById(R.id.selectionLayout);
//if the data is not compliant with the interface we create it
int size = selectionLayout.getChildCount();
mMovies = new ArrayList<MovieItemHolder>(size);
for (int i = 0; i < size; i++) {
View v = selectionLayout.getChildAt(i);
v.setOnClickListener(this);
if(v instanceof RelativeLayout){
boolean isBig = false;
if(i == 0 || i == 5)
isBig = true;
MovieItemHolder holder = new MovieItemHolder(getActivity(), isBig);
RelativeLayout layout = (RelativeLayout) v;
holder.image = (ImageView) layout.getChildAt(0);
holder.text = (TextView) layout.getChildAt(1);
layout.setTag(holder);
mMovies.add(holder);
}
}
if(mCurrentTop != null)
updateContent(mCurrentTop);
return contentView;
}
@Override
public void onCacheRequestFinished(int requestId, ResponseBusinessObject response) {
mRequestIds.remove(Integer.valueOf(requestId));
mDataManager.removeOnDataListener(requestId, this);
if(response instanceof Top100){
Top100 top = (Top100) response;
mCurrentTop = top;
//we update the page content
updateContent(top);
//we compute the update time
Calendar updateTime = Calendar.getInstance();
updateTime.setTimeInMillis(top._updatedAt.getTimeInMillis());
updateTime.add(Calendar.MINUTE, top.ttl);
//we update the content if the ttl is consumed
if(updateTime.compareTo(Calendar.getInstance()) <= 0) {
try {
mDataManager.getTop100(DataManager.TYPE_NETWORK, this, DataLibRequest.OPTION_NO_OPTION, null, null);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onDataFromDatabase(int code, ArrayList<?> data) {
}
@Override
public void onRequestFinished(int requestId, boolean suceed, BusinessResponse response) {
mRequestIds.remove(Integer.valueOf(requestId));
mDataManager.removeOnDataListener(requestId, this);
if(!suceed)
return;
switch (response.webserviceType) {
case NetflixService.WEBSERVICE_TOP100:
Top100 top100 = (Top100) response.response;
mCurrentTop = top100;
updateContent(top100);
break;
// case NetflixService.WEBSERVICE_MOVIEIMAGE:
//
// MovieImage img = (MovieImage) response.response;
// mMovies.get(0).image.setImageBitmap(img.image);
//
// break;
default:
break;
}
}
public void updateContent(Top100 top100) {
if(top100 == null || top100.itemTop100 == null)
return;
ArrayList<ItemTop100> movies = top100.itemTop100;
try {
int size = mMovies.size();
for (int i = 0; i < size; i++) {
MovieItemHolder holder = mMovies.get(i);
ItemTop100 item = movies.get(i);
holder.item = item;
holder.text.post(new UpdateText(holder.text, movies.get(i).title));
CacheableBitmapDrawable bmp = null;
if(item.image != null){
String appendix = "";
if(holder.mBigImage) //this is dirty but handles the different size of the big elements on the selection panel... quickly :-)
appendix = MovieItemHolder.BIG_APPENDIX;
bmp = mBitmapCache.get(item.getPosterName() + appendix);
if(bmp != null){
holder.image.post(holder.new UpdatePoster(bmp, holder.image));
}
}
//if we didn't updated the item
if(bmp == null) {
//we ask for movie's picture
//the movie item holder will handle the bitmap received
mDataManager.getMovieImage(DataManager.TYPE_CACHE, holder, item.getImageUrl(), DataLibRequest.OPTION_NO_OPTION, null, null);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public class UpdateText implements Runnable {
TextView mView;
String mContent;
public UpdateText(TextView view, String text){
mView = view;
mContent = text;
}
@Override
public void run() {
mView.setText(mContent);
}
}
@Override
public void onClick(View v) {
Out.d("", "Press");
if(v instanceof RelativeLayout){
Object tag = v.getTag();
if(tag instanceof MovieItemHolder){
MovieItemHolder holder = (MovieItemHolder) tag;
if(holder.item != null){
ItemTop100 item = holder.item;
Intent i = new Intent(getActivity(), MovieActivity.class);
i.putExtra(MovieActivity.EXTRA_MOVIE, item);
getActivity().startActivity(i);
}
}
}
}
}