diff --git a/app/build.gradle b/app/build.gradle index b30c442..e0234bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,16 @@ apply plugin: 'com.android.application' +apply plugin: 'android-apt' +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:1.3.0' + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' + } +} android { compileSdkVersion 23 buildToolsVersion "23.0.1" @@ -39,4 +50,7 @@ dependencies { compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' compile 'com.jakewharton:butterknife:7.0.1' + + apt 'net.simonvt.schematic:schematic-compiler:0.6.3' + compile 'net.simonvt.schematic:schematic:0.6.3' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index df57679..827d45a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,6 +20,11 @@ + + diff --git a/app/src/main/java/net/headlezz/udacityproject1/MainActivity.java b/app/src/main/java/net/headlezz/udacityproject1/MainActivity.java index 726c58d..988e6cf 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/MainActivity.java +++ b/app/src/main/java/net/headlezz/udacityproject1/MainActivity.java @@ -5,6 +5,7 @@ import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import net.headlezz.udacityproject1.movielist.MovieListFragment; import net.headlezz.udacityproject1.tmdbapi.Movie; /** diff --git a/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java b/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java index 9e18515..f9514a2 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java +++ b/app/src/main/java/net/headlezz/udacityproject1/MovieDetailsFragment.java @@ -19,6 +19,7 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import net.headlezz.udacityproject1.favorites.FavoriteProviderHelper; import net.headlezz.udacityproject1.tmdbapi.Movie; import net.headlezz.udacityproject1.tmdbapi.TMDBApi; import net.headlezz.udacityproject1.tmdbapi.Video; @@ -51,6 +52,9 @@ public class MovieDetailsFragment extends Fragment implements Callback 0) + return true; + return false; + } + + public void addFavorite(Movie movie) { + ContentValues values = new ContentValues(); + values.put(FavoriteColumns._ID, movie.getId()); + values.put(FavoriteColumns.TITLE, movie.getTitle()); + values.put(FavoriteColumns.OVERVIEW, movie.getOverview()); + values.put(FavoriteColumns.POSTERPATH, movie.getPosterPath()); + values.put(FavoriteColumns.AVRATING, movie.getAvRating()); + values.put(FavoriteColumns.RELEASEDATE, movie.getReleaseDate().getTime()); + mResolver.insert(FavoriteProvider.Favorites.FAVORITES_URI, values); + } + + public void removeFavorite(Movie movie) { + mResolver.delete(FavoriteProvider.Favorites.FAVORITES_URI, FavoriteColumns._ID + "=?", new String[]{String.valueOf(movie.getId())}); + } + +} diff --git a/app/src/main/java/net/headlezz/udacityproject1/MovieListAdapter.java b/app/src/main/java/net/headlezz/udacityproject1/movielist/AbstractMovieListAdapter.java similarity index 69% rename from app/src/main/java/net/headlezz/udacityproject1/MovieListAdapter.java rename to app/src/main/java/net/headlezz/udacityproject1/movielist/AbstractMovieListAdapter.java index e0bd2e7..1527882 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/MovieListAdapter.java +++ b/app/src/main/java/net/headlezz/udacityproject1/movielist/AbstractMovieListAdapter.java @@ -1,4 +1,4 @@ -package net.headlezz.udacityproject1; +package net.headlezz.udacityproject1.movielist; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -6,20 +6,20 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import net.headlezz.udacityproject1.MovieNavigation; +import net.headlezz.udacityproject1.R; import net.headlezz.udacityproject1.tmdbapi.Movie; -import net.headlezz.udacityproject1.tmdbapi.MovieList; import net.headlezz.udacityproject1.tmdbapi.TMDBApi; -import java.util.List; - -public class MovieListAdapter extends RecyclerView.Adapter{ +/** + * Abstract class for shwoing a list of movie posters + */ +public abstract class AbstractMovieListAdapter extends RecyclerView.Adapter { MovieNavigation mMovieNavigation; - List mMovies; - public MovieListAdapter(MovieNavigation mn, MovieList movieList) { + public AbstractMovieListAdapter(MovieNavigation mn) { mMovieNavigation = mn; - mMovies = movieList.getList(); } @Override @@ -30,13 +30,14 @@ public class MovieListAdapter extends RecyclerView.Adapter mMovies; + + public MovieListAdapter(MovieNavigation mn, MovieList movieList) { + super(mn); + mMovies = movieList.getList(); + } + + @Override + public int getItemCount() { + return mMovies.size(); + } + + @Override + protected Movie getMovieForPosition(int position) { + return mMovies.get(position); + } +} diff --git a/app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java b/app/src/main/java/net/headlezz/udacityproject1/movielist/MovieListFragment.java similarity index 80% rename from app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java rename to app/src/main/java/net/headlezz/udacityproject1/movielist/MovieListFragment.java index 1e242c7..5ddc32c 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/MovieListFragment.java +++ b/app/src/main/java/net/headlezz/udacityproject1/movielist/MovieListFragment.java @@ -1,7 +1,8 @@ -package net.headlezz.udacityproject1; +package net.headlezz.udacityproject1.movielist; import android.content.Context; import android.content.res.Configuration; +import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.widget.GridLayoutManager; @@ -16,6 +17,9 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.Toast; +import net.headlezz.udacityproject1.MovieNavigation; +import net.headlezz.udacityproject1.R; +import net.headlezz.udacityproject1.favorites.FavoriteProviderHelper; import net.headlezz.udacityproject1.tmdbapi.MovieList; import net.headlezz.udacityproject1.tmdbapi.TMDBApi; @@ -42,7 +46,11 @@ public class MovieListFragment extends Fragment implements Callback { * The currently selected sorting order of the list * @see TMDBApi */ - private int mSortingOrder = TMDBApi.SORT_ORDER_MOST_POPULAR; + private int mSortingOrder = SORT_ORDER_MOST_POPULAR; + + public static final int SORT_ORDER_MOST_POPULAR = TMDBApi.SORT_ORDER_MOST_POPULAR; + public static final int SORT_ORDER_HIGHEST_RATED = TMDBApi.SORT_ORDER_HIGHEST_RATED; + public static final int SORT_ORDER_FAVORITES = 3; private MovieList mMovieList; @@ -120,11 +128,15 @@ public class MovieListFragment extends Fragment implements Callback { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_sort_popularity: - mSortingOrder = TMDBApi.SORT_ORDER_MOST_POPULAR; + mSortingOrder = SORT_ORDER_MOST_POPULAR; loadMovieList(); return true; case R.id.action_sort_rating: - mSortingOrder = TMDBApi.SORT_ORDER_HIGHEST_RATED; + mSortingOrder = SORT_ORDER_HIGHEST_RATED; + loadMovieList(); + return true; + case R.id.action_sort_favorites: + mSortingOrder = SORT_ORDER_FAVORITES; loadMovieList(); return true; default: @@ -138,9 +150,18 @@ public class MovieListFragment extends Fragment implements Callback { */ private void loadMovieList() { stopLoadingMovies(); // stop any running query before starting a new one - mProgressBar.setVisibility(View.VISIBLE); - mMovieListCall = TMDBApi.discoverMovies(mSortingOrder, getString(R.string.api_key)); - mMovieListCall.enqueue(this); + if(mSortingOrder != SORT_ORDER_FAVORITES) { + mProgressBar.setVisibility(View.VISIBLE); + mMovieListCall = TMDBApi.discoverMovies(mSortingOrder, getString(R.string.api_key)); + mMovieListCall.enqueue(this); + } else + loadMovieListFromFavorites(); + } + + private void loadMovieListFromFavorites() { + // TODO async? + Cursor cursor = new FavoriteProviderHelper(getContext().getContentResolver()).getAllFavorites(); + mMovieGridView.setAdapter(new CursorMovieListAdapter(cursor,(MovieNavigation) getActivity())); } @Override @@ -190,7 +211,7 @@ public class MovieListFragment extends Fragment implements Callback { @Override public void onSaveInstanceState(Bundle outState) { outState.putInt("sort_order", mSortingOrder); - if(mMovieList != null) + if(mMovieList != null && mSortingOrder != SORT_ORDER_FAVORITES) outState.putParcelable("movielist", mMovieList); 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 32f4ea6..b18d49a 100644 --- a/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/Movie.java +++ b/app/src/main/java/net/headlezz/udacityproject1/tmdbapi/Movie.java @@ -1,10 +1,13 @@ package net.headlezz.udacityproject1.tmdbapi; +import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; import com.google.gson.annotations.SerializedName; +import net.headlezz.udacityproject1.favorites.FavoriteColumns; + import java.util.Date; /** @@ -55,6 +58,17 @@ public class Movie implements Parcelable { return id; } + public static Movie fromCurrentCursorPosition(Cursor cursor) { + Movie movie = new Movie(); + movie.id = cursor.getLong(cursor.getColumnIndex(FavoriteColumns._ID)); + movie.title = cursor.getString(cursor.getColumnIndex(FavoriteColumns.TITLE)); + movie.posterPath = cursor.getString(cursor.getColumnIndex(FavoriteColumns.POSTERPATH)); + movie.overview = cursor.getString(cursor.getColumnIndex(FavoriteColumns.OVERVIEW)); + movie.releaseDate = new Date(cursor.getLong(cursor.getColumnIndex(FavoriteColumns.RELEASEDATE))); + movie.avRating = cursor.getDouble(cursor.getColumnIndex(FavoriteColumns.AVRATING)); + return movie; + } + /**** Parcelable stuff *****/ @Override diff --git a/app/src/main/res/drawable-hdpi/ic_action_star_0.png b/app/src/main/res/drawable-hdpi/ic_action_star_0.png new file mode 100644 index 0000000..7767483 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_star_10.png b/app/src/main/res/drawable-hdpi/ic_action_star_10.png new file mode 100644 index 0000000..d44cddb Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_star_10.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_action_star_0.png b/app/src/main/res/drawable-ldpi/ic_action_star_0.png new file mode 100644 index 0000000..c9bdc90 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_action_star_10.png b/app/src/main/res/drawable-ldpi/ic_action_star_10.png new file mode 100644 index 0000000..237d66c Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_action_star_10.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_star_0.png b/app/src/main/res/drawable-mdpi/ic_action_star_0.png new file mode 100644 index 0000000..2d79c98 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_star_10.png b/app/src/main/res/drawable-mdpi/ic_action_star_10.png new file mode 100644 index 0000000..dc6455c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_star_10.png differ diff --git a/app/src/main/res/drawable-tvdpi/ic_action_star_0.png b/app/src/main/res/drawable-tvdpi/ic_action_star_0.png new file mode 100644 index 0000000..85f7bee Binary files /dev/null and b/app/src/main/res/drawable-tvdpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-tvdpi/ic_action_star_10.png b/app/src/main/res/drawable-tvdpi/ic_action_star_10.png new file mode 100644 index 0000000..ff55be8 Binary files /dev/null and b/app/src/main/res/drawable-tvdpi/ic_action_star_10.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_star_0.png b/app/src/main/res/drawable-xhdpi/ic_action_star_0.png new file mode 100644 index 0000000..fd4a180 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_star_10.png b/app/src/main/res/drawable-xhdpi/ic_action_star_10.png new file mode 100644 index 0000000..c9f8032 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_star_10.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_star_0.png b/app/src/main/res/drawable-xxhdpi/ic_action_star_0.png new file mode 100644 index 0000000..f1773b7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_star_10.png b/app/src/main/res/drawable-xxhdpi/ic_action_star_10.png new file mode 100644 index 0000000..06992cb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_star_10.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_star_0.png b/app/src/main/res/drawable-xxxhdpi/ic_action_star_0.png new file mode 100644 index 0000000..12252d2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_star_0.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_star_10.png b/app/src/main/res/drawable-xxxhdpi/ic_action_star_10.png new file mode 100644 index 0000000..3c987ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_star_10.png differ diff --git a/app/src/main/res/menu/movie_details_menu.xml b/app/src/main/res/menu/movie_details_menu.xml index 44c027e..979805a 100644 --- a/app/src/main/res/menu/movie_details_menu.xml +++ b/app/src/main/res/menu/movie_details_menu.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/app/src/main/res/menu/movie_list_menu.xml b/app/src/main/res/menu/movie_list_menu.xml index f3d4645..5fbf231 100644 --- a/app/src/main/res/menu/movie_list_menu.xml +++ b/app/src/main/res/menu/movie_list_menu.xml @@ -1,6 +1,7 @@ - - + + +