diff --git a/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java b/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java index 1071dc9..662b66a 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java +++ b/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java @@ -19,9 +19,6 @@ import net.headlezz.udacityproject1.tmdbapi.TMDBApi; */ public class MovieDetailsFragment extends Fragment { - // TODO make me pretty - // TODO not scrolling to the end - public static final String TAG = MovieDetailsFragment.class.getSimpleName(); public static final String BUNDLE_ARG_MOVIE = "movie"; @@ -69,7 +66,7 @@ public class MovieDetailsFragment extends Fragment { TMDBApi.loadPoster(ivPoster, mMovie); tvTitle.setText(mMovie.getTitle()); tvOverview.setText(mMovie.getOverview()); - String formatedDate = DateUtils.formatDateTime(tvReleaseDate.getContext(), mMovie.getReleaseDate(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_YEAR); + String formatedDate = DateUtils.formatDateTime(tvReleaseDate.getContext(), mMovie.getReleaseDate().getTime(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_YEAR); tvReleaseDate.setText(getString(R.string.movie_release_date, formatedDate)); tvRating.setText(getString(R.string.movie_rating, mMovie.getAvRating())); } diff --git a/app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java b/app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java index 9ba75e7..449792b 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java +++ b/app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java @@ -13,6 +13,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.ProgressBar; import android.widget.Toast; import net.headlezz.udacityproject1.tmdbapi.Movie; @@ -29,9 +30,6 @@ import retrofit.Call; */ public class MovieListFragment extends Fragment { - // TODO fix restore - // TODO show progressbar while loading - public static final String TAG = MovieListFragment.class.getSimpleName(); /** @@ -46,6 +44,7 @@ public class MovieListFragment extends Fragment { private int mSortingOrder = TMDBApi.SORT_ORDER_MOST_POPULAR; RecyclerView mMovieGridView; + ProgressBar mProgressBar; /** * Holding a reference to running api calls. This makes it possible to cancel them if @@ -63,6 +62,7 @@ public class MovieListFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_movie_list, container, false); mMovieGridView = (RecyclerView) view.findViewById(R.id.movie_list_grid); + mProgressBar = (ProgressBar) view.findViewById(R.id.movie_list_progressBar); return view; } @@ -70,6 +70,9 @@ public class MovieListFragment extends Fragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mMovieGridView.setLayoutManager(new GridLayoutManager(getActivity(), getNumColumns())); + + if(savedInstanceState != null) + mSortingOrder = savedInstanceState.getInt("sort_order"); } /** @@ -118,17 +121,21 @@ public class MovieListFragment extends Fragment { * mSortingOrder will be used to determine the sorting */ private void loadMovieList() { + mProgressBar.setVisibility(View.VISIBLE); stopLoadingMovies(); // stop any running query before starting a new one MovieListCallback cb = new MovieListCallback() { @Override protected void onResponse(MovieList movies) { setListToGrid(movies.getList()); + mProgressBar.setVisibility(View.GONE); } @Override public void onFailure(Throwable t) { - Log.d(TAG, t.getMessage()); - Toast.makeText(getActivity(), "Somethig went wrong", Toast.LENGTH_SHORT).show(); + Log.d(TAG, t.getClass().getSimpleName() + " " + t.getMessage()); + mProgressBar.setVisibility(View.GONE); + if(!t.getMessage().equals("Canceled") && getActivity() != null) + Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_SHORT).show(); } }; mMovieListCall = TMDBApi.discoverMovies(mSortingOrder, getString(R.string.api_key)); @@ -161,4 +168,10 @@ public class MovieListFragment extends Fragment { if(!(context instanceof MovieNavigation)) throw new RuntimeException("Activity must implement " + MovieNavigation.class.getSimpleName()); } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putInt("sort_order", mSortingOrder); + super.onSaveInstanceState(outState); + } } diff --git a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/Movie.java b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/Movie.java index 8a7da7f..785258c 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/Movie.java +++ b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/Movie.java @@ -3,6 +3,10 @@ package net.headlezz.udacityproject1.tmdbapi; import android.os.Parcel; import android.os.Parcelable; +import com.google.gson.annotations.SerializedName; + +import java.util.Date; + /** * Data object to represent a single movie * Only required data from the api is stored to save memory @@ -13,10 +17,17 @@ public class Movie implements Parcelable { public Movie() {} String title; + + @SerializedName("poster_path") String posterPath; + String overview; + + @SerializedName("vote_average") double avRating; - long releaseDate; + + @SerializedName("release_date") + Date releaseDate; public String getTitle() { return title; @@ -34,7 +45,7 @@ public class Movie implements Parcelable { return avRating; } - public long getReleaseDate() { + public Date getReleaseDate() { return releaseDate; } @@ -51,7 +62,7 @@ public class Movie implements Parcelable { dest.writeString(posterPath); dest.writeString(overview); dest.writeDouble(avRating); - dest.writeLong(releaseDate); + dest.writeLong(releaseDate.getTime()); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @@ -69,7 +80,7 @@ public class Movie implements Parcelable { posterPath = src.readString(); overview = src.readString(); avRating = src.readDouble(); - releaseDate = src.readLong(); + releaseDate = new Date(src.readLong()); } diff --git a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieList.java b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieList.java index ec568b2..9bdf311 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieList.java +++ b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieList.java @@ -2,6 +2,9 @@ package net.headlezz.udacityproject1.tmdbapi; import java.util.List; +/** + * Wrapper class for list of movies + */ public class MovieList { public MovieList(List movieList) { diff --git a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieListDeserializer.java b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieListDeserializer.java index 0f7be80..87340a3 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieListDeserializer.java +++ b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/MovieListDeserializer.java @@ -1,37 +1,27 @@ package net.headlezz.udacityproject1.tmdbapi; -import android.util.Log; - +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import java.lang.reflect.Type; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; +/** + * Gson deserializer for movie lists + */ public class MovieListDeserializer implements JsonDeserializer { @Override public MovieList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-DD").create(); List movieList = new ArrayList<>(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD"); for(JsonElement elem : json.getAsJsonObject().getAsJsonArray("results")) { - try { // TODO fix this and remove try/catch - JsonObject jsonObj = elem.getAsJsonObject(); - Movie m = new Movie(); - m.title = jsonObj.get("title").getAsString(); - m.overview = jsonObj.get("overview").getAsString(); - m.avRating = jsonObj.get("vote_average").getAsDouble(); - m.posterPath = jsonObj.get("poster_path").getAsString(); - m.releaseDate = sdf.parse(jsonObj.get("release_date").getAsString()).getTime(); - movieList.add(m); - } catch (Exception e) { - Log.e(MovieListDeserializer.class.getSimpleName(), e.toString()); - } + movieList.add(gson.fromJson(elem, Movie.class)); } return new MovieList(movieList); } diff --git a/app/src/main/res/drawable/chappie_ver4.jpg b/app/src/main/res/drawable/chappie_ver4.jpg deleted file mode 100644 index f8166d9..0000000 Binary files a/app/src/main/res/drawable/chappie_ver4.jpg and /dev/null differ diff --git a/app/src/main/res/layout/fragment_movie_details.xml b/app/src/main/res/layout/fragment_movie_details.xml index e79c221..3a8b00d 100644 --- a/app/src/main/res/layout/fragment_movie_details.xml +++ b/app/src/main/res/layout/fragment_movie_details.xml @@ -7,7 +7,7 @@ + android:padding="16dp"> + android:adjustViewBounds="true" /> @@ -9,4 +9,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0e81335..283cb04 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,5 +2,5 @@ UdacityProject1 Settings Release: %1$s - Rating: %1$s/10 + Rating: %1$s/10.0