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 @@