package com.rickstart.moviefriend.ui.fragments;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.content.res.Resources;
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.FragmentManager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.Toast;
import com.rickstart.moviefriend.R;
import com.rickstart.moviefriend.models.Casting;
import com.rickstart.moviefriend.models.Movie;
import com.rickstart.moviefriend.ui.adapters.MovieAdapter;
import com.rickstart.moviefriend.util.GalleryUtils;
import com.rickstart.moviefriend.util.ImageCache;
import com.rickstart.moviefriend.util.ImageFetcher;
import com.rickstart.moviefriend.util.Utils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link MovieGridFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link MovieGridFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class MovieGridFragment extends Fragment implements Serializable{
private static final String API_KEY = "35hg37n2zaybbwf7wncj9vgw";
private static final String IMAGE_CACHE_DIR = "thumbs";
private static final int MOVIE_PAGE_LIMIT = 20;
private NavigationDrawerFragment mNavigationDrawerFragment;
private EditText searchBox;
private Button searchButton;
private ListView moviesList;
public GridView gvMovies;
private int columnWidth;
private ImageFetcher mImageFetcher;
private GalleryUtils galleryUtils;
private MovieAdapter movieAdapter;
public ArrayList<Movie> movieArrayList;
private Menu optionsMenu;
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private String query = "frozen";
private OnFragmentInteractionListener mListener;
private ImageCache.ImageCacheParams cacheParams;
int mImageThumbSize;
public static MovieGridFragment newInstance(String param1, String param2) {
MovieGridFragment fragment = new MovieGridFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public MovieGridFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
galleryUtils = new GalleryUtils(getActivity());
cacheParams =
new ImageCache.ImageCacheParams(getActivity(), IMAGE_CACHE_DIR);
cacheParams.setMemCacheSizePercent(0.25f); // Set memory cache to 25% of app memory
mImageThumbSize = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_size);
Resources r = getResources();
float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
GalleryUtils.GRID_PADDING, r.getDisplayMetrics());
// The ImageFetcher takes care of loading images into our ImageView children asynchronously
columnWidth = (int) ((galleryUtils.getScreenWidth() -(2*padding) - ((GalleryUtils.NUM_OF_COLUMNS + 1) * padding)) / GalleryUtils.NUM_OF_COLUMNS);
mImageFetcher = new ImageFetcher(getActivity(),mImageThumbSize,columnWidth);
mImageFetcher.setLoadingImage(R.drawable.empty_photo);
mImageFetcher.addImageCache(getActivity().getSupportFragmentManager(), cacheParams);
//new RequestTask().execute("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=" + API_KEY + "&q="+query+"&page_limit=" + MOVIE_PAGE_LIMIT);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View row = inflater.inflate(R.layout.fragment_movie_grid, container, false);
gvMovies = (GridView) row.findViewById(R.id.gvMovies);
initilizeGridLayout();
// String[] list = new String[] {"Alex Rojas","Yussel Luna","Ricardo","4","5","6","7"};
gvMovies.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
// Pause fetcher to ensure smoother scrolling when flinging
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
// Before Honeycomb pause image loading on scroll to help with performance
if (!Utils.hasHoneycomb()) {
mImageFetcher.setPauseWork(true);
}
} else {
mImageFetcher.setPauseWork(false);
}
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
gvMovies.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MovieDetailFragment movieDetailFragment = MovieDetailFragment.newInstance(movieArrayList.get(position));
Log.e("MOVIE",movieArrayList.get(position).getTitle());
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.beginTransaction().replace(R.id.container, movieDetailFragment).addToBackStack(null)
.commit();
Toast.makeText(getActivity(),movieArrayList.get(position).getTitle(),Toast.LENGTH_SHORT).show();
}
});
//MovieAdapter adapter = new MovieAdapter (getActivity(), list);
//gvMovies.setAdapter(adapter);
return row;
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
this.optionsMenu = menu;
menu.clear();
inflater.inflate(R.menu.grid_movies, menu);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager manager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
SearchView search = (SearchView) menu.findItem(R.id.menu_search).getActionView();
search.setSearchableInfo(manager.getSearchableInfo(getActivity().getComponentName()));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s){
//Toast.makeText(getActivity(),s,Toast.LENGTH_SHORT).show();
String query = s.trim().replaceAll(" +", "%20");
Toast.makeText(getActivity(),query,Toast.LENGTH_SHORT).show();
new RequestTask().execute("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=" + API_KEY + "&q="+query+"&page_limit=" + MOVIE_PAGE_LIMIT);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
//loadData(query);
return true;
}
});
//restoreActionBar();
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.airport_menuRefresh:
Toast.makeText(getActivity(),"Refre",Toast.LENGTH_SHORT).show();
setRefreshActionButtonState(true);
// Complete with your code
return true;
}
return super.onOptionsItemSelected(item);
}
public void setRefreshActionButtonState(final boolean refreshing) {
if (optionsMenu != null) {
final MenuItem refreshItem = optionsMenu
.findItem(R.id.airport_menuRefresh);
if (refreshItem != null) {
if (refreshing) {
refreshItem.setActionView(R.layout.actionbar_indeterminate_progress);
} else {
refreshItem.setActionView(null);
}
}
}
}
private void showGlobalContextActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setTitle("GRIS");
}
private ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar();
}
@Override
public void onResume() {
super.onResume();
refreshMoviesList(movieArrayList);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
/*try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}*/
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
private class RequestTask extends AsyncTask<String, String, String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
setRefreshActionButtonState(true);
}
// make a request to the specified url
@Override
protected String doInBackground(String... uri)
{
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;
String responseString = null;
try
{
// make a HTTP request
response = httpclient.execute(new HttpGet(uri[0]));
StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK)
{
// request successful - read the response and close the connection
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
responseString = out.toString();
}
else
{
// request failed - close the connection
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
}
catch (Exception e)
{
Log.d("Test", "Couldn't make a successful request!");
}
return responseString;
}
// if the request above completed successfully, this method will
// automatically run so you can do something with the response
@Override
protected void onPostExecute(String response)
{
super.onPostExecute(response);
setRefreshActionButtonState(false);
if (response != null)
{
try
{
JSONObject jsonResponse = new JSONObject(response);
movieArrayList =new ArrayList<Movie>();
JSONArray movies = jsonResponse.getJSONArray("movies");
for (int i = 0; i < movies.length(); i++)
{
movieArrayList.add(new Movie());
JSONObject movie = movies.getJSONObject(i);
JSONObject release = movie.getJSONObject("release_dates");
JSONArray cast = movie.getJSONArray("abridged_cast");
// moviePoster[i] = posters.getString("original").replace("_tmb","_ori");
JSONObject posters= movie.getJSONObject("posters");
JSONObject rating= movie.getJSONObject("ratings");
movieArrayList.get(i).setTitle(movie.getString("title"));
movieArrayList.get(i).setRating(Float.parseFloat(rating.getString("audience_score")));
movieArrayList.get(i).setCriticsRating(Float.parseFloat(rating.getString("critics_score")));
if(posters.has("original"))
movieArrayList.get(i).setPoster(posters.getString("original").replace("_tmb","_det"));
movieArrayList.get(i).setYear(movie.optInt("year",0));
movieArrayList.get(i).setRuntime(movie.getString("runtime"));
if(release.has("theater"))
movieArrayList.get(i).setReleaseDate(release.getString("theater"));
movieArrayList.get(i).setSynopsis(movie.getString("synopsis"));
String characters[]=new String[1000];
for(int j=0;j<cast.length();j++){
JSONObject charactersJson = cast.getJSONObject(j);
if(charactersJson.has("characters")) {
movieArrayList.get(i).setCasting(new Casting());
movieArrayList.get(i).getCasting().setName(cast.getJSONObject(j).getString("name"));
characters[i]=cast.getJSONObject(j).getString("name");
// Log.d("characters ",characters[i]);
}
//movieArrayList.get(i).getCasting(new Casting(cast.getJSONObject(j).getString("name"),characters));
}
}
// update the UI
refreshMoviesList(movieArrayList);
}
catch (JSONException e)
{
e.printStackTrace();
Log.d("Test", "Failed to parse the JSON response!");
}
}
}
}
private void refreshMoviesList(ArrayList<Movie> movies)
{
if(movies!=null) {
if(movies.size()==0)
Toast.makeText(getActivity(),getResources().getString(R.string.empty_search),Toast.LENGTH_SHORT).show();
else {
Log.d("Test", "Movies: "+movies.size());
movieAdapter = new MovieAdapter(getActivity(), columnWidth, movies, mImageFetcher);
gvMovies.setAdapter(movieAdapter);
}
}
}
private void initilizeGridLayout() {
Resources r = getResources();
float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
GalleryUtils.GRID_PADDING, r.getDisplayMetrics());
columnWidth = (int) ((galleryUtils.getScreenWidth() -(2*padding) - ((GalleryUtils.NUM_OF_COLUMNS + 1) * padding)) / GalleryUtils.NUM_OF_COLUMNS);
gvMovies.setNumColumns(GalleryUtils.NUM_OF_COLUMNS);
gvMovies.setColumnWidth(columnWidth);
gvMovies.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
gvMovies.setPadding((int) padding, (int) padding, (int) padding,(int) padding);
gvMovies.setHorizontalSpacing((int) padding);
gvMovies.setVerticalSpacing((int) padding);
}
@Override
public void onPause() {
super.onPause();
mImageFetcher.setPauseWork(false);
mImageFetcher.setExitTasksEarly(true);
mImageFetcher.flushCache();
}
@Override
public void onDestroy() {
super.onDestroy();
mImageFetcher.closeCache();
}
}