From 1cd1e859e888be909f19f58f85d7b98b3d9390f8 Mon Sep 17 00:00:00 2001 From: mehmetbalbay Date: Sun, 9 Aug 2020 21:07:51 +0300 Subject: [PATCH] #update ListBindingAdapter adapter set method added (Bug Fix), MovieListFragment Live data observer not triggered ViewLifeCycleOwner added (Bug Fix), MovieDetailActivity LifecycleRegister removed (Crash Bug Fix), Categorized Tab Movies added(Dao DI Adapter ViewModel - Science Comedy), Room Database Migration Method Added --- app/src/main/AndroidManifest.xml | 10 +- .../data/MovieRepository.java | 61 +++++++- .../data/local/MovieDatabase.java | 19 ++- .../data/local/dao/MovieDao.java | 30 ++++ .../data/local/entity/ComedyMovieEntity.java | 125 +++++++++++++++ .../data/local/entity/PopularMovieEntity.java | 125 +++++++++++++++ .../data/local/entity/ScienceMovieEntity.java | 125 +++++++++++++++ .../data/remote/ApiConstants.java | 2 + .../data/remote/MovieDBService.java | 9 ++ .../remote/model/ComedyMoviesResponse.java | 22 +++ .../remote/model/PopularMoviesResponse.java | 22 +++ .../remote/model/ScienceMoviesResponse.java | 22 +++ .../databinding/ListBindingAdapter.java | 11 +- .../di/ActivityBuilderModule.java | 10 +- .../com/androidarchitecture/di/AppModule.java | 6 +- .../di/FragmentBuilderModule.java | 8 + .../di/ViewModelModule.java | 28 +++- .../androidarchitecture/enums/MovieType.java | 7 + .../comedy/MovieComedyDetailActivity.java | 69 +++++++++ .../comedy/MovieComedyDetailViewModel.java | 29 ++++ .../{ => popular}/MovieDetailActivity.java | 33 ++-- .../{ => popular}/MovieDetailViewModel.java | 8 +- .../science/MovieScienceDetailActivity.java | 73 +++++++++ .../science/MovieScienceDetailViewModel.java | 29 ++++ .../ui/main/MovieListAdapter.java | 6 +- .../ui/main/MovieListFragment.java | 15 +- .../ui/main/MoviesPagerAdapter.java | 15 +- .../main/comedy/ComedyMovieListCallback.java | 13 ++ .../main/comedy/MovieComedyListAdapter.java | 72 +++++++++ .../main/comedy/MovieComedyListFragment.java | 64 ++++++++ .../main/comedy/MovieComedyListViewModel.java | 29 ++++ .../main/science/MovieScienceListAdapter.java | 72 +++++++++ .../science/MovieScienceListFragment.java | 64 ++++++++ .../science/MovieScienceListViewModel.java | 29 ++++ .../science/ScienceMovieListCallback.java | 13 ++ .../layout/activity_comedy_movie_detail.xml | 145 ++++++++++++++++++ .../layout/activity_science_movie_detail.xml | 145 ++++++++++++++++++ .../res/layout/item_comedy_movie_list.xml | 28 ++++ .../res/layout/item_science_movie_list.xml | 28 ++++ 39 files changed, 1573 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ComedyMovieEntity.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/data/local/entity/PopularMovieEntity.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ScienceMovieEntity.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ComedyMoviesResponse.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/data/remote/model/PopularMoviesResponse.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ScienceMoviesResponse.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/enums/MovieType.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailActivity.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailViewModel.java rename app/src/main/java/iammert/com/androidarchitecture/ui/detail/{ => popular}/MovieDetailActivity.java (79%) rename app/src/main/java/iammert/com/androidarchitecture/ui/detail/{ => popular}/MovieDetailViewModel.java (70%) create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailActivity.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailViewModel.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/ComedyMovieListCallback.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListAdapter.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListFragment.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListViewModel.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListAdapter.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListFragment.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListViewModel.java create mode 100644 app/src/main/java/iammert/com/androidarchitecture/ui/main/science/ScienceMovieListCallback.java create mode 100644 app/src/main/res/layout/activity_comedy_movie_detail.xml create mode 100644 app/src/main/res/layout/activity_science_movie_detail.xml create mode 100644 app/src/main/res/layout/item_comedy_movie_list.xml create mode 100644 app/src/main/res/layout/item_science_movie_list.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ff47a2..bb991c3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,15 @@ + + + + diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/MovieRepository.java b/app/src/main/java/iammert/com/androidarchitecture/data/MovieRepository.java index 96580d9..4fbb07e 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/data/MovieRepository.java +++ b/app/src/main/java/iammert/com/androidarchitecture/data/MovieRepository.java @@ -1,16 +1,21 @@ package iammert.com.androidarchitecture.data; -import androidx.lifecycle.LiveData; import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; import java.util.List; import javax.inject.Inject; import iammert.com.androidarchitecture.data.local.dao.MovieDao; +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; import iammert.com.androidarchitecture.data.local.entity.MovieEntity; +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; +import iammert.com.androidarchitecture.data.remote.ApiConstants; import iammert.com.androidarchitecture.data.remote.MovieDBService; +import iammert.com.androidarchitecture.data.remote.model.ComedyMoviesResponse; import iammert.com.androidarchitecture.data.remote.model.MoviesResponse; +import iammert.com.androidarchitecture.data.remote.model.ScienceMoviesResponse; import retrofit2.Call; /** @@ -50,7 +55,59 @@ protected Call createCall() { }.getAsLiveData(); } - public LiveData getMovie(int id){ + public LiveData>> loadComedyMovies() { + return new NetworkBoundResource, ComedyMoviesResponse>() { + + @Override + protected void saveCallResult(@NonNull ComedyMoviesResponse item) { + movieDao.saveComedyMovies(item.getResults()); + } + + @NonNull + @Override + protected LiveData> loadFromDb() { + return movieDao.loadComedyMovies(); + } + + @NonNull + @Override + protected Call createCall() { + return movieDBService.loadComedyMoviesByGenre(ApiConstants.COMEDY_GENRE_ID); + } + }.getAsLiveData(); + } + + public LiveData>> loadScienceMovies() { + return new NetworkBoundResource, ScienceMoviesResponse>() { + + @Override + protected void saveCallResult(@NonNull ScienceMoviesResponse item) { + movieDao.saveScienceMovies(item.getResults()); + } + + @NonNull + @Override + protected LiveData> loadFromDb() { + return movieDao.loadScienceMovie(); + } + + @NonNull + @Override + protected Call createCall() { + return movieDBService.loadScienceMoviesByGenre(ApiConstants.SCIENCE_GENRE_ID); + } + }.getAsLiveData(); + } + + public LiveData getMovie(int id) { return movieDao.getMovie(id); } + + public LiveData getComedyMovie(int id) { + return movieDao.getComedyMovie(id); + } + + public LiveData getScienceMovie(int id) { + return movieDao.getScienceMovie(id); + } } diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/local/MovieDatabase.java b/app/src/main/java/iammert/com/androidarchitecture/data/local/MovieDatabase.java index e2ea58a..6f9431f 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/data/local/MovieDatabase.java +++ b/app/src/main/java/iammert/com/androidarchitecture/data/local/MovieDatabase.java @@ -1,16 +1,31 @@ package iammert.com.androidarchitecture.data.local; +import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.RoomDatabase; +import androidx.room.migration.Migration; +import androidx.sqlite.db.SupportSQLiteDatabase; import iammert.com.androidarchitecture.data.local.dao.MovieDao; +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; import iammert.com.androidarchitecture.data.local.entity.MovieEntity; +import iammert.com.androidarchitecture.data.local.entity.PopularMovieEntity; +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; /** * Created by mertsimsek on 19/05/2017. */ -@Database(entities = {MovieEntity.class}, version = 2) -public abstract class MovieDatabase extends RoomDatabase{ +@Database(entities = {MovieEntity.class, ComedyMovieEntity.class, PopularMovieEntity.class, ScienceMovieEntity.class}, version = 3) +public abstract class MovieDatabase extends RoomDatabase { public abstract MovieDao movieDao(); + + public static final Migration MIGRATION_1_3 = new Migration(1, 3) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("CREATE TABLE 'comedy_movies' (_id INTEGER NOT NULL, overview TEXT, voteAverage REAL NOT NULL, voteCount INTEGER NOT NULL, backdropPath TEXT, posterPath TEXT, adult INTEGER NOT NULL, title TEXT, originalLanguage TEXT, originalTitle TEXT, PRIMARY KEY('_id'))"); + database.execSQL("CREATE TABLE 'science_movies' (_id INTEGER NOT NULL, overview TEXT, voteAverage REAL NOT NULL, voteCount INTEGER NOT NULL, backdropPath TEXT, posterPath TEXT, adult INTEGER NOT NULL, title TEXT, originalLanguage TEXT, originalTitle TEXT, PRIMARY KEY('_id'))"); + database.execSQL("CREATE TABLE 'popular_movies' (_id INTEGER NOT NULL, overview TEXT, voteAverage REAL NOT NULL, voteCount INTEGER NOT NULL, backdropPath TEXT, posterPath TEXT, adult INTEGER NOT NULL, title TEXT, originalLanguage TEXT, originalTitle TEXT, PRIMARY KEY('_id'))"); + } + }; } diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/local/dao/MovieDao.java b/app/src/main/java/iammert/com/androidarchitecture/data/local/dao/MovieDao.java index b103ca5..4e213e8 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/data/local/dao/MovieDao.java +++ b/app/src/main/java/iammert/com/androidarchitecture/data/local/dao/MovieDao.java @@ -8,7 +8,10 @@ import java.util.List; +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; import iammert.com.androidarchitecture.data.local.entity.MovieEntity; +import iammert.com.androidarchitecture.data.local.entity.PopularMovieEntity; +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; /** * Created by mertsimsek on 19/05/2017. @@ -19,10 +22,37 @@ public interface MovieDao { @Query("SELECT * FROM movies") LiveData> loadMovies(); + @Query("SELECT * FROM comedy_movies") + LiveData> loadComedyMovies(); + + @Query("SELECT * FROM popular_movies") + LiveData> loadPopularMovies(); + + @Query("SELECT * FROM science_movies") + LiveData> loadScienceMovie(); + @Insert(onConflict = OnConflictStrategy.REPLACE) void saveMovies(List movieEntities); + @Insert(onConflict = OnConflictStrategy.REPLACE) + void saveComedyMovies(List comedyMovieEntities); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void savePopularMovies(List popularMovieEntities); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void saveScienceMovies(List scienceMovieEntities); + @Query("SELECT * FROM movies WHERE id=:id") LiveData getMovie(int id); + @Query("SELECT * FROM comedy_movies WHERE _id=:id") + LiveData getComedyMovie(int id); + + @Query("SELECT * FROM popular_movies WHERE _id=:id") + LiveData getPopularMovie(int id); + + @Query("SELECT * FROM science_movies WHERE _id=:id") + LiveData getScienceMovie(int id); + } diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ComedyMovieEntity.java b/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ComedyMovieEntity.java new file mode 100644 index 0000000..06801fd --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ComedyMovieEntity.java @@ -0,0 +1,125 @@ +package iammert.com.androidarchitecture.data.local.entity; + +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import com.google.gson.annotations.SerializedName; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +@Entity(tableName = "comedy_movies") +public class ComedyMovieEntity { + + @PrimaryKey + @SerializedName("id") + private int _id; + + @SerializedName("poster_path") + private String posterPath; + + @SerializedName("adult") + private boolean adult; + + @SerializedName("overview") + private String overview; + + @SerializedName("original_title") + private String originalTitle; + + @SerializedName("title") + private String title; + + @SerializedName("vote_count") + private int voteCount; + + @SerializedName("vote_average") + private double voteAverage; + + @SerializedName("backdrop_path") + private String backdropPath; + + @SerializedName("original_language") + private String originalLanguage; + + public int getId() { + return _id; + } + + public void setId(int id) { + this._id = id; + } + + public String getPosterPath() { + return posterPath; + } + + public void setPosterPath(String posterPath) { + this.posterPath = posterPath; + } + + public boolean isAdult() { + return adult; + } + + public void setAdult(boolean adult) { + this.adult = adult; + } + + public String getOverview() { + return overview; + } + + public void setOverview(String overview) { + this.overview = overview; + } + + public String getOriginalTitle() { + return originalTitle; + } + + public void setOriginalTitle(String originalTitle) { + this.originalTitle = originalTitle; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getVoteCount() { + return voteCount; + } + + public void setVoteCount(int voteCount) { + this.voteCount = voteCount; + } + + public double getVoteAverage() { + return voteAverage; + } + + public void setVoteAverage(double voteAverage) { + this.voteAverage = voteAverage; + } + + public String getBackdropPath() { + return backdropPath; + } + + public void setBackdropPath(String backdropPath) { + this.backdropPath = backdropPath; + } + + public String getOriginalLanguage() { + return originalLanguage; + } + + public void setOriginalLanguage(String originalLanguage) { + this.originalLanguage = originalLanguage; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/PopularMovieEntity.java b/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/PopularMovieEntity.java new file mode 100644 index 0000000..fba1a9e --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/PopularMovieEntity.java @@ -0,0 +1,125 @@ +package iammert.com.androidarchitecture.data.local.entity; + +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import com.google.gson.annotations.SerializedName; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +@Entity(tableName = "popular_movies") +public class PopularMovieEntity { + + @PrimaryKey + @SerializedName("id") + private int _id; + + @SerializedName("poster_path") + private String posterPath; + + @SerializedName("adult") + private boolean adult; + + @SerializedName("overview") + private String overview; + + @SerializedName("original_title") + private String originalTitle; + + @SerializedName("title") + private String title; + + @SerializedName("vote_count") + private int voteCount; + + @SerializedName("vote_average") + private double voteAverage; + + @SerializedName("backdrop_path") + private String backdropPath; + + @SerializedName("original_language") + private String originalLanguage; + + public int getId() { + return _id; + } + + public void setId(int id) { + this._id = id; + } + + public String getPosterPath() { + return posterPath; + } + + public void setPosterPath(String posterPath) { + this.posterPath = posterPath; + } + + public boolean isAdult() { + return adult; + } + + public void setAdult(boolean adult) { + this.adult = adult; + } + + public String getOverview() { + return overview; + } + + public void setOverview(String overview) { + this.overview = overview; + } + + public String getOriginalTitle() { + return originalTitle; + } + + public void setOriginalTitle(String originalTitle) { + this.originalTitle = originalTitle; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getVoteCount() { + return voteCount; + } + + public void setVoteCount(int voteCount) { + this.voteCount = voteCount; + } + + public double getVoteAverage() { + return voteAverage; + } + + public void setVoteAverage(double voteAverage) { + this.voteAverage = voteAverage; + } + + public String getBackdropPath() { + return backdropPath; + } + + public void setBackdropPath(String backdropPath) { + this.backdropPath = backdropPath; + } + + public String getOriginalLanguage() { + return originalLanguage; + } + + public void setOriginalLanguage(String originalLanguage) { + this.originalLanguage = originalLanguage; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ScienceMovieEntity.java b/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ScienceMovieEntity.java new file mode 100644 index 0000000..6417b49 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/data/local/entity/ScienceMovieEntity.java @@ -0,0 +1,125 @@ +package iammert.com.androidarchitecture.data.local.entity; + +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import com.google.gson.annotations.SerializedName; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +@Entity(tableName = "science_movies") +public class ScienceMovieEntity { + + @PrimaryKey + @SerializedName("id") + private int _id; + + @SerializedName("poster_path") + private String posterPath; + + @SerializedName("adult") + private boolean adult; + + @SerializedName("overview") + private String overview; + + @SerializedName("original_title") + private String originalTitle; + + @SerializedName("title") + private String title; + + @SerializedName("vote_count") + private int voteCount; + + @SerializedName("vote_average") + private double voteAverage; + + @SerializedName("backdrop_path") + private String backdropPath; + + @SerializedName("original_language") + private String originalLanguage; + + public int getId() { + return _id; + } + + public void setId(int id) { + this._id = id; + } + + public String getPosterPath() { + return posterPath; + } + + public void setPosterPath(String posterPath) { + this.posterPath = posterPath; + } + + public boolean isAdult() { + return adult; + } + + public void setAdult(boolean adult) { + this.adult = adult; + } + + public String getOverview() { + return overview; + } + + public void setOverview(String overview) { + this.overview = overview; + } + + public String getOriginalTitle() { + return originalTitle; + } + + public void setOriginalTitle(String originalTitle) { + this.originalTitle = originalTitle; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getVoteCount() { + return voteCount; + } + + public void setVoteCount(int voteCount) { + this.voteCount = voteCount; + } + + public double getVoteAverage() { + return voteAverage; + } + + public void setVoteAverage(double voteAverage) { + this.voteAverage = voteAverage; + } + + public String getBackdropPath() { + return backdropPath; + } + + public void setBackdropPath(String backdropPath) { + this.backdropPath = backdropPath; + } + + public String getOriginalLanguage() { + return originalLanguage; + } + + public void setOriginalLanguage(String originalLanguage) { + this.originalLanguage = originalLanguage; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/remote/ApiConstants.java b/app/src/main/java/iammert/com/androidarchitecture/data/remote/ApiConstants.java index 0287357..328ba27 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/data/remote/ApiConstants.java +++ b/app/src/main/java/iammert/com/androidarchitecture/data/remote/ApiConstants.java @@ -8,6 +8,8 @@ public class ApiConstants { public static final String ENDPOINT = "https://api.themoviedb.org/3/"; public static final String IMAGE_ENDPOINT_PREFIX = "https://image.tmdb.org/t/p/w500/"; + public static final String COMEDY_GENRE_ID = "35"; + public static final String SCIENCE_GENRE_ID = "878"; public static final String API_KEY = ""; public static final int TIMEOUT_IN_SEC = 15; } diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/remote/MovieDBService.java b/app/src/main/java/iammert/com/androidarchitecture/data/remote/MovieDBService.java index 4b07da5..c987b17 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/data/remote/MovieDBService.java +++ b/app/src/main/java/iammert/com/androidarchitecture/data/remote/MovieDBService.java @@ -1,8 +1,11 @@ package iammert.com.androidarchitecture.data.remote; +import iammert.com.androidarchitecture.data.remote.model.ComedyMoviesResponse; import iammert.com.androidarchitecture.data.remote.model.MoviesResponse; +import iammert.com.androidarchitecture.data.remote.model.ScienceMoviesResponse; import retrofit2.Call; import retrofit2.http.GET; +import retrofit2.http.Query; /** * Created by mertsimsek on 19/05/2017. @@ -13,4 +16,10 @@ public interface MovieDBService { @GET("movie/popular") Call loadMovies(); + @GET("discover/movie") + Call loadScienceMoviesByGenre(@Query("with_genres") String genreId); + + @GET("discover/movie") + Call loadComedyMoviesByGenre(@Query("with_genres") String genreId); + } diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ComedyMoviesResponse.java b/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ComedyMoviesResponse.java new file mode 100644 index 0000000..5536cc2 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ComedyMoviesResponse.java @@ -0,0 +1,22 @@ +package iammert.com.androidarchitecture.data.remote.model; + + +import java.util.List; + +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class ComedyMoviesResponse { + private List results; + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/PopularMoviesResponse.java b/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/PopularMoviesResponse.java new file mode 100644 index 0000000..ce04232 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/PopularMoviesResponse.java @@ -0,0 +1,22 @@ +package iammert.com.androidarchitecture.data.remote.model; + + +import java.util.List; + +import iammert.com.androidarchitecture.data.local.entity.PopularMovieEntity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class PopularMoviesResponse { + private List results; + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ScienceMoviesResponse.java b/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ScienceMoviesResponse.java new file mode 100644 index 0000000..06e2d88 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/data/remote/model/ScienceMoviesResponse.java @@ -0,0 +1,22 @@ +package iammert.com.androidarchitecture.data.remote.model; + + +import java.util.List; + +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class ScienceMoviesResponse { + private List results; + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/databinding/ListBindingAdapter.java b/app/src/main/java/iammert/com/androidarchitecture/databinding/ListBindingAdapter.java index 540a9c4..aa883cc 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/databinding/ListBindingAdapter.java +++ b/app/src/main/java/iammert/com/androidarchitecture/databinding/ListBindingAdapter.java @@ -12,15 +12,18 @@ * Created by mertsimsek on 20/05/2017. */ -public final class ListBindingAdapter{ +public final class ListBindingAdapter { @BindingAdapter(value = "resource") - public static void setResource(RecyclerView recyclerView, Resource resource){ + public static void setResource(RecyclerView recyclerView, Resource resource) { RecyclerView.Adapter adapter = recyclerView.getAdapter(); - if(adapter == null) + if (adapter == null) return; - if(resource == null || resource.data == null) + if (resource == null || resource.data == null) return; + if (adapter instanceof BaseAdapter) { + ((BaseAdapter) adapter).setData((List) resource.data); + } } } diff --git a/app/src/main/java/iammert/com/androidarchitecture/di/ActivityBuilderModule.java b/app/src/main/java/iammert/com/androidarchitecture/di/ActivityBuilderModule.java index ab84611..cba4e3a 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/di/ActivityBuilderModule.java +++ b/app/src/main/java/iammert/com/androidarchitecture/di/ActivityBuilderModule.java @@ -2,7 +2,9 @@ import dagger.Module; import dagger.android.ContributesAndroidInjector; -import iammert.com.androidarchitecture.ui.detail.MovieDetailActivity; +import iammert.com.androidarchitecture.ui.detail.comedy.MovieComedyDetailActivity; +import iammert.com.androidarchitecture.ui.detail.popular.MovieDetailActivity; +import iammert.com.androidarchitecture.ui.detail.science.MovieScienceDetailActivity; import iammert.com.androidarchitecture.ui.main.MainActivity; /** @@ -16,4 +18,10 @@ public abstract class ActivityBuilderModule { @ContributesAndroidInjector abstract MovieDetailActivity movieDetailActivity(); + + @ContributesAndroidInjector + abstract MovieComedyDetailActivity movieComedyDetailActivity(); + + @ContributesAndroidInjector + abstract MovieScienceDetailActivity movieScienceDetailActivity(); } diff --git a/app/src/main/java/iammert/com/androidarchitecture/di/AppModule.java b/app/src/main/java/iammert/com/androidarchitecture/di/AppModule.java index 5d35304..0d0f83d 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/di/AppModule.java +++ b/app/src/main/java/iammert/com/androidarchitecture/di/AppModule.java @@ -1,7 +1,7 @@ package iammert.com.androidarchitecture.di; import android.app.Application; -import androidx.lifecycle.ViewModelProvider; + import androidx.room.Room; import java.util.concurrent.TimeUnit; @@ -50,7 +50,9 @@ MovieDBService provideRetrofit(OkHttpClient okHttpClient) { @Provides @Singleton MovieDatabase provideMovieDatabase(Application application) { - return Room.databaseBuilder(application, MovieDatabase.class, "aa.db").build(); + return Room.databaseBuilder(application, MovieDatabase.class, "aa.db") + .addMigrations(MovieDatabase.MIGRATION_1_3) + .build(); } @Provides diff --git a/app/src/main/java/iammert/com/androidarchitecture/di/FragmentBuilderModule.java b/app/src/main/java/iammert/com/androidarchitecture/di/FragmentBuilderModule.java index 7355ce0..8f2c1bd 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/di/FragmentBuilderModule.java +++ b/app/src/main/java/iammert/com/androidarchitecture/di/FragmentBuilderModule.java @@ -3,6 +3,8 @@ import dagger.Module; import dagger.android.ContributesAndroidInjector; import iammert.com.androidarchitecture.ui.main.MovieListFragment; +import iammert.com.androidarchitecture.ui.main.comedy.MovieComedyListFragment; +import iammert.com.androidarchitecture.ui.main.science.MovieScienceListFragment; /** * Created by mertsimsek on 30/05/2017. @@ -12,4 +14,10 @@ public abstract class FragmentBuilderModule { @ContributesAndroidInjector abstract MovieListFragment contributeMovieListFragment(); + + @ContributesAndroidInjector + abstract MovieComedyListFragment contributeMovieComedyListFragment(); + + @ContributesAndroidInjector + abstract MovieScienceListFragment contributeMovieScienceListFragment(); } diff --git a/app/src/main/java/iammert/com/androidarchitecture/di/ViewModelModule.java b/app/src/main/java/iammert/com/androidarchitecture/di/ViewModelModule.java index f1b5563..c7ef8c9 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/di/ViewModelModule.java +++ b/app/src/main/java/iammert/com/androidarchitecture/di/ViewModelModule.java @@ -6,8 +6,12 @@ import dagger.Binds; import dagger.Module; import dagger.multibindings.IntoMap; -import iammert.com.androidarchitecture.ui.detail.MovieDetailViewModel; +import iammert.com.androidarchitecture.ui.detail.comedy.MovieComedyDetailViewModel; +import iammert.com.androidarchitecture.ui.detail.popular.MovieDetailViewModel; +import iammert.com.androidarchitecture.ui.detail.science.MovieScienceDetailViewModel; import iammert.com.androidarchitecture.ui.main.MovieListViewModel; +import iammert.com.androidarchitecture.ui.main.comedy.MovieComedyListViewModel; +import iammert.com.androidarchitecture.ui.main.science.MovieScienceListViewModel; import iammert.com.androidarchitecture.viewmodel.MovieViewModelFactory; /** @@ -22,10 +26,30 @@ public abstract class ViewModelModule { @ViewModelKey(MovieListViewModel.class) abstract ViewModel bindsMovieListViewModel(MovieListViewModel movieListViewModel); + @Binds + @IntoMap + @ViewModelKey(MovieComedyListViewModel.class) + abstract ViewModel bindsMovieComedyListViewModel(MovieComedyListViewModel movieListViewModel); + + @Binds + @IntoMap + @ViewModelKey(MovieScienceListViewModel.class) + abstract ViewModel bindsMovieScienceListViewModel(MovieScienceListViewModel movieListViewModel); + @Binds @IntoMap @ViewModelKey(MovieDetailViewModel.class) - abstract ViewModel bindsMovieDetailViewModel(MovieDetailViewModel movieDetailViewModel); + abstract ViewModel bindsMovieDetailViewModel(MovieDetailViewModel movieDetailViewModel); + + @Binds + @IntoMap + @ViewModelKey(MovieComedyDetailViewModel.class) + abstract ViewModel bindsMovieComedyDetailViewModel(MovieComedyDetailViewModel movieDetailViewModel); + + @Binds + @IntoMap + @ViewModelKey(MovieScienceDetailViewModel.class) + abstract ViewModel bindsMovieScienceDetailViewModel(MovieScienceDetailViewModel movieDetailViewModel); @Binds abstract ViewModelProvider.Factory bindsViewModelFactory(MovieViewModelFactory movieViewModelFactory); diff --git a/app/src/main/java/iammert/com/androidarchitecture/enums/MovieType.java b/app/src/main/java/iammert/com/androidarchitecture/enums/MovieType.java new file mode 100644 index 0000000..fd1f55c --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/enums/MovieType.java @@ -0,0 +1,7 @@ +package iammert.com.androidarchitecture.enums; + +public enum MovieType { + POPULAR, + COMEDY, + SCIENCE +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailActivity.java b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailActivity.java new file mode 100644 index 0000000..cee2649 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailActivity.java @@ -0,0 +1,69 @@ +package iammert.com.androidarchitecture.ui.detail.comedy; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; + +import javax.inject.Inject; + +import dagger.android.AndroidInjection; +import iammert.com.androidarchitecture.R; +import iammert.com.androidarchitecture.databinding.ActivityComedyMovieDetailBinding; +import iammert.com.androidarchitecture.enums.MovieType; + +/** + * Created by mertsimsek on 19/05/2017. + */ + +public class MovieComedyDetailActivity extends AppCompatActivity { + + private static final String KEY_MOVIE_ID = "key_movie_id"; + + ActivityComedyMovieDetailBinding binding; + + @Inject + ViewModelProvider.Factory viewModelFactory; + + MovieComedyDetailViewModel movieDetailViewModel; + + public static Intent newIntent(Context context, int movieId, MovieType movieType) { + Intent intent = new Intent(context, MovieComedyDetailActivity.class); + intent.putExtra(KEY_MOVIE_ID, movieId); + return intent; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + AndroidInjection.inject(this); + super.onCreate(savedInstanceState); + binding = DataBindingUtil.setContentView(this, R.layout.activity_comedy_movie_detail); + movieDetailViewModel = ViewModelProviders.of(this, viewModelFactory).get(MovieComedyDetailViewModel.class); + + setSupportActionBar(binding.toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + int movieId = getIntent().getIntExtra(KEY_MOVIE_ID, 0); + movieDetailViewModel.getComedyMovie(movieId) + .observe(this, movieEntity -> binding.setMovie(movieEntity)); + + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + ActivityCompat.finishAfterTransition(this); + break; + } + return super.onOptionsItemSelected(item); + } + +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailViewModel.java b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailViewModel.java new file mode 100644 index 0000000..efe59fe --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/comedy/MovieComedyDetailViewModel.java @@ -0,0 +1,29 @@ +package iammert.com.androidarchitecture.ui.detail.comedy; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import javax.inject.Inject; + +import iammert.com.androidarchitecture.data.MovieRepository; +import iammert.com.androidarchitecture.data.Resource; +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; + +/** + * Created by mertsimsek on 21/05/2017. + */ + +public class MovieComedyDetailViewModel extends ViewModel { + private final LiveData> movieDetail = new MutableLiveData<>(); + private final MovieRepository movieRepository; + + @Inject + public MovieComedyDetailViewModel(MovieRepository movieRepository) { + this.movieRepository = movieRepository; + } + + public LiveData getComedyMovie(int id) { + return movieRepository.getComedyMovie(id); + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/MovieDetailActivity.java b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/popular/MovieDetailActivity.java similarity index 79% rename from app/src/main/java/iammert/com/androidarchitecture/ui/detail/MovieDetailActivity.java rename to app/src/main/java/iammert/com/androidarchitecture/ui/detail/popular/MovieDetailActivity.java index 30f8138..825e620 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/MovieDetailActivity.java +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/popular/MovieDetailActivity.java @@ -1,34 +1,32 @@ -package iammert.com.androidarchitecture.ui.detail; +package iammert.com.androidarchitecture.ui.detail.popular; -import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.LifecycleRegistry; -import androidx.lifecycle.LifecycleRegistryOwner; -import androidx.lifecycle.ViewModelProvider; -import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; -import androidx.databinding.DataBindingUtil; import android.os.Bundle; +import android.view.MenuItem; + import androidx.annotation.Nullable; -import androidx.core.app.ActivityCompat; import androidx.appcompat.app.AppCompatActivity; -import android.view.MenuItem; +import androidx.core.app.ActivityCompat; +import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; import javax.inject.Inject; import dagger.android.AndroidInjection; import iammert.com.androidarchitecture.R; import iammert.com.androidarchitecture.databinding.ActivityMovieDetailBinding; +import iammert.com.androidarchitecture.enums.MovieType; /** * Created by mertsimsek on 19/05/2017. */ -public class MovieDetailActivity extends AppCompatActivity implements LifecycleOwner { +public class MovieDetailActivity extends AppCompatActivity { private static final String KEY_MOVIE_ID = "key_movie_id"; - - LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); + private static final String KEY_MOVIE_TYPE = "key_movie_type"; ActivityMovieDetailBinding binding; @@ -37,9 +35,10 @@ public class MovieDetailActivity extends AppCompatActivity implements LifecycleO MovieDetailViewModel movieDetailViewModel; - public static Intent newIntent(Context context, int movieId) { + public static Intent newIntent(Context context, int movieId, MovieType movieType) { Intent intent = new Intent(context, MovieDetailActivity.class); intent.putExtra(KEY_MOVIE_ID, movieId); + intent.putExtra(KEY_MOVIE_TYPE, movieType); return intent; } @@ -53,9 +52,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setSupportActionBar(binding.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + MovieType movieType = (MovieType) getIntent().getSerializableExtra(KEY_MOVIE_TYPE); + int movieId = getIntent().getIntExtra(KEY_MOVIE_ID, 0); movieDetailViewModel.getMovie(movieId) .observe(this, movieEntity -> binding.setMovie(movieEntity)); + } @Override @@ -68,9 +70,4 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - @Override - public LifecycleRegistry getLifecycle() { - return lifecycleRegistry; - } - } diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/MovieDetailViewModel.java b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/popular/MovieDetailViewModel.java similarity index 70% rename from app/src/main/java/iammert/com/androidarchitecture/ui/detail/MovieDetailViewModel.java rename to app/src/main/java/iammert/com/androidarchitecture/ui/detail/popular/MovieDetailViewModel.java index d292ee5..e25cf9d 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/MovieDetailViewModel.java +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/popular/MovieDetailViewModel.java @@ -1,4 +1,4 @@ -package iammert.com.androidarchitecture.ui.detail; +package iammert.com.androidarchitecture.ui.detail.popular; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; @@ -14,8 +14,8 @@ * Created by mertsimsek on 21/05/2017. */ -public class MovieDetailViewModel extends ViewModel{ - private final LiveData> movieDetail = new MutableLiveData<>(); +public class MovieDetailViewModel extends ViewModel { + private final LiveData> movieDetail = new MutableLiveData<>(); private final MovieRepository movieRepository; @Inject @@ -23,7 +23,7 @@ public MovieDetailViewModel(MovieRepository movieRepository) { this.movieRepository = movieRepository; } - public LiveData getMovie(int id){ + public LiveData getMovie(int id) { return movieRepository.getMovie(id); } } diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailActivity.java b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailActivity.java new file mode 100644 index 0000000..4aa3f12 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailActivity.java @@ -0,0 +1,73 @@ +package iammert.com.androidarchitecture.ui.detail.science; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; + +import javax.inject.Inject; + +import dagger.android.AndroidInjection; +import iammert.com.androidarchitecture.R; +import iammert.com.androidarchitecture.databinding.ActivityScienceMovieDetailBinding; +import iammert.com.androidarchitecture.enums.MovieType; + +/** + * Created by mertsimsek on 19/05/2017. + */ + +public class MovieScienceDetailActivity extends AppCompatActivity { + + private static final String KEY_MOVIE_ID = "key_movie_id"; + private static final String KEY_MOVIE_TYPE = "key_movie_type"; + + ActivityScienceMovieDetailBinding binding; + + @Inject + ViewModelProvider.Factory viewModelFactory; + + MovieScienceDetailViewModel movieDetailViewModel; + + public static Intent newIntent(Context context, int movieId, MovieType movieType) { + Intent intent = new Intent(context, MovieScienceDetailActivity.class); + intent.putExtra(KEY_MOVIE_ID, movieId); + intent.putExtra(KEY_MOVIE_TYPE, movieType); + return intent; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + AndroidInjection.inject(this); + super.onCreate(savedInstanceState); + binding = DataBindingUtil.setContentView(this, R.layout.activity_science_movie_detail); + movieDetailViewModel = ViewModelProviders.of(this, viewModelFactory).get(MovieScienceDetailViewModel.class); + + setSupportActionBar(binding.toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + MovieType movieType = (MovieType) getIntent().getSerializableExtra(KEY_MOVIE_TYPE); + + int movieId = getIntent().getIntExtra(KEY_MOVIE_ID, 0); + movieDetailViewModel.getScienceMovie(movieId) + .observe(this, movieEntity -> binding.setMovie(movieEntity)); + + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + ActivityCompat.finishAfterTransition(this); + break; + } + return super.onOptionsItemSelected(item); + } + +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailViewModel.java b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailViewModel.java new file mode 100644 index 0000000..61788db --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/detail/science/MovieScienceDetailViewModel.java @@ -0,0 +1,29 @@ +package iammert.com.androidarchitecture.ui.detail.science; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import javax.inject.Inject; + +import iammert.com.androidarchitecture.data.MovieRepository; +import iammert.com.androidarchitecture.data.Resource; +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class MovieScienceDetailViewModel extends ViewModel { + private final LiveData> movieDetail = new MutableLiveData<>(); + private final MovieRepository movieRepository; + + @Inject + public MovieScienceDetailViewModel(MovieRepository movieRepository) { + this.movieRepository = movieRepository; + } + + public LiveData getScienceMovie(int id) { + return movieRepository.getScienceMovie(id); + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListAdapter.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListAdapter.java index dff1b86..ef245d9 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListAdapter.java +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListAdapter.java @@ -1,11 +1,11 @@ package iammert.com.androidarchitecture.ui.main; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListFragment.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListFragment.java index 922f10e..dcf0250 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListFragment.java +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/MovieListFragment.java @@ -1,19 +1,20 @@ package iammert.com.androidarchitecture.ui.main; import android.os.Bundle; -import androidx.annotation.Nullable; -import androidx.core.app.ActivityOptionsCompat; -import androidx.recyclerview.widget.GridLayoutManager; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityOptionsCompat; +import androidx.recyclerview.widget.GridLayoutManager; + import iammert.com.androidarchitecture.R; import iammert.com.androidarchitecture.data.local.entity.MovieEntity; import iammert.com.androidarchitecture.databinding.FragmentMovieListBinding; +import iammert.com.androidarchitecture.enums.MovieType; import iammert.com.androidarchitecture.ui.BaseFragment; -import iammert.com.androidarchitecture.ui.detail.MovieDetailActivity; +import iammert.com.androidarchitecture.ui.detail.popular.MovieDetailActivity; /** * Created by mertsimsek on 19/05/2017. @@ -51,13 +52,13 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); viewModel.getPopularMovies() - .observe(this, listResource -> dataBinding.setResource(listResource)); + .observe(getViewLifecycleOwner(), listResource -> dataBinding.setResource(listResource)); } @Override public void onMovieClicked(MovieEntity movieEntity, View sharedView) { ActivityOptionsCompat options = ActivityOptionsCompat. makeSceneTransitionAnimation(getActivity(), sharedView, getString(R.string.shared_image)); - startActivity(MovieDetailActivity.newIntent(getActivity(), movieEntity.getId()), options.toBundle()); + startActivity(MovieDetailActivity.newIntent(getActivity(), movieEntity.getId(), MovieType.POPULAR), options.toBundle()); } } diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/MoviesPagerAdapter.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/MoviesPagerAdapter.java index aac8f36..5aeaf62 100644 --- a/app/src/main/java/iammert/com/androidarchitecture/ui/main/MoviesPagerAdapter.java +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/MoviesPagerAdapter.java @@ -4,11 +4,14 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; +import iammert.com.androidarchitecture.ui.main.comedy.MovieComedyListFragment; +import iammert.com.androidarchitecture.ui.main.science.MovieScienceListFragment; + /** * Created by mertsimsek on 20/05/2017. */ -public class MoviesPagerAdapter extends FragmentStatePagerAdapter{ +public class MoviesPagerAdapter extends FragmentStatePagerAdapter { private static final String[] titles = new String[]{"Popular", "Science", "Comedy"}; @@ -18,7 +21,15 @@ public MoviesPagerAdapter(FragmentManager fm) { @Override public Fragment getItem(int i) { - return MovieListFragment.newInstance(); + if (i == 0) { + return MovieListFragment.newInstance(); + } else if (i == 1) { + return MovieScienceListFragment.newInstance(); + } else if (i == 2) { + return MovieComedyListFragment.newInstance(); + } else { + return MovieListFragment.newInstance(); + } } @Override diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/ComedyMovieListCallback.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/ComedyMovieListCallback.java new file mode 100644 index 0000000..2aea757 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/ComedyMovieListCallback.java @@ -0,0 +1,13 @@ +package iammert.com.androidarchitecture.ui.main.comedy; + +import android.view.View; + +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; + +/** + * Created by mertsimsek on 21/05/2017. + */ + +public interface ComedyMovieListCallback { + void onMovieClicked(ComedyMovieEntity movieEntity, View sharedView); +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListAdapter.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListAdapter.java new file mode 100644 index 0000000..3f353df --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListAdapter.java @@ -0,0 +1,72 @@ +package iammert.com.androidarchitecture.ui.main.comedy; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; +import iammert.com.androidarchitecture.databinding.ItemComedyMovieListBinding; +import iammert.com.androidarchitecture.ui.BaseAdapter; + +/** + * Created by mertsimsek on 20/05/2017. + */ + +public class MovieComedyListAdapter extends BaseAdapter { + + private final ComedyMovieListCallback movieListCallback; + private List movieEntities; + + public MovieComedyListAdapter(@NonNull ComedyMovieListCallback movieListCallback) { + movieEntities = new ArrayList<>(); + this.movieListCallback = movieListCallback; + } + + @Override + public void setData(List movieEntities) { + this.movieEntities = movieEntities; + notifyDataSetChanged(); + } + + @Override + public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + return MovieViewHolder.create(LayoutInflater.from(viewGroup.getContext()), viewGroup, movieListCallback); + } + + @Override + public void onBindViewHolder(MovieViewHolder viewHolder, int i) { + viewHolder.onBind(movieEntities.get(i)); + } + + @Override + public int getItemCount() { + return movieEntities.size(); + } + + static class MovieViewHolder extends RecyclerView.ViewHolder { + + ItemComedyMovieListBinding binding; + + public MovieViewHolder(ItemComedyMovieListBinding binding, ComedyMovieListCallback callback) { + super(binding.getRoot()); + this.binding = binding; + binding.getRoot().setOnClickListener(v -> + callback.onMovieClicked(binding.getMovie(), binding.imageViewCover)); + } + + public static MovieViewHolder create(LayoutInflater inflater, ViewGroup parent, ComedyMovieListCallback callback) { + ItemComedyMovieListBinding itemMovieListBinding = ItemComedyMovieListBinding.inflate(inflater, parent, false); + return new MovieViewHolder(itemMovieListBinding, callback); + } + + public void onBind(ComedyMovieEntity movieEntity) { + binding.setMovie(movieEntity); + binding.executePendingBindings(); + } + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListFragment.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListFragment.java new file mode 100644 index 0000000..b4004df --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListFragment.java @@ -0,0 +1,64 @@ +package iammert.com.androidarchitecture.ui.main.comedy; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.core.app.ActivityOptionsCompat; +import androidx.recyclerview.widget.GridLayoutManager; + +import iammert.com.androidarchitecture.R; +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; +import iammert.com.androidarchitecture.databinding.FragmentMovieListBinding; +import iammert.com.androidarchitecture.enums.MovieType; +import iammert.com.androidarchitecture.ui.BaseFragment; +import iammert.com.androidarchitecture.ui.detail.comedy.MovieComedyDetailActivity; + +/** + * Created by mertsimsek on 19/05/2017. + */ + +public class MovieComedyListFragment extends BaseFragment implements ComedyMovieListCallback { + + public static MovieComedyListFragment newInstance() { + Bundle args = new Bundle(); + MovieComedyListFragment fragment = new MovieComedyListFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + public Class getViewModel() { + return MovieComedyListViewModel.class; + } + + @Override + public int getLayoutRes() { + return R.layout.fragment_movie_list; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + dataBinding.recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2)); + dataBinding.recyclerView.setAdapter(new MovieComedyListAdapter(this)); + return dataBinding.getRoot(); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + viewModel.getComedyMovies() + .observe(getViewLifecycleOwner(), listResource -> dataBinding.setResource(listResource)); + } + + @Override + public void onMovieClicked(ComedyMovieEntity movieEntity, View sharedView) { + ActivityOptionsCompat options = ActivityOptionsCompat. + makeSceneTransitionAnimation(getActivity(), sharedView, getString(R.string.shared_image)); + startActivity(MovieComedyDetailActivity.newIntent(getActivity(), movieEntity.getId(), MovieType.COMEDY), options.toBundle()); + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListViewModel.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListViewModel.java new file mode 100644 index 0000000..f850693 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/comedy/MovieComedyListViewModel.java @@ -0,0 +1,29 @@ +package iammert.com.androidarchitecture.ui.main.comedy; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import java.util.List; + +import javax.inject.Inject; + +import iammert.com.androidarchitecture.data.MovieRepository; +import iammert.com.androidarchitecture.data.Resource; +import iammert.com.androidarchitecture.data.local.entity.ComedyMovieEntity; + +/** + * Created by mertsimsek on 19/05/2017. + */ + +public class MovieComedyListViewModel extends ViewModel { + private final LiveData>> comedyMovies; + + @Inject + public MovieComedyListViewModel(MovieRepository movieRepository) { + comedyMovies = movieRepository.loadComedyMovies(); + } + + LiveData>> getComedyMovies() { + return comedyMovies; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListAdapter.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListAdapter.java new file mode 100644 index 0000000..cb186a2 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListAdapter.java @@ -0,0 +1,72 @@ +package iammert.com.androidarchitecture.ui.main.science; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; +import iammert.com.androidarchitecture.databinding.ItemScienceMovieListBinding; +import iammert.com.androidarchitecture.ui.BaseAdapter; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class MovieScienceListAdapter extends BaseAdapter { + + private final ScienceMovieListCallback movieListCallback; + private List movieEntities; + + public MovieScienceListAdapter(@NonNull ScienceMovieListCallback movieListCallback) { + movieEntities = new ArrayList<>(); + this.movieListCallback = movieListCallback; + } + + @Override + public void setData(List movieEntities) { + this.movieEntities = movieEntities; + notifyDataSetChanged(); + } + + @Override + public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + return MovieViewHolder.create(LayoutInflater.from(viewGroup.getContext()), viewGroup, movieListCallback); + } + + @Override + public void onBindViewHolder(MovieViewHolder viewHolder, int i) { + viewHolder.onBind(movieEntities.get(i)); + } + + @Override + public int getItemCount() { + return movieEntities.size(); + } + + static class MovieViewHolder extends RecyclerView.ViewHolder { + + ItemScienceMovieListBinding binding; + + public MovieViewHolder(ItemScienceMovieListBinding binding, ScienceMovieListCallback callback) { + super(binding.getRoot()); + this.binding = binding; + binding.getRoot().setOnClickListener(v -> + callback.onMovieClicked(binding.getMovie(), binding.imageViewCover)); + } + + public static MovieViewHolder create(LayoutInflater inflater, ViewGroup parent, ScienceMovieListCallback callback) { + ItemScienceMovieListBinding itemMovieListBinding = ItemScienceMovieListBinding.inflate(inflater, parent, false); + return new MovieViewHolder(itemMovieListBinding, callback); + } + + public void onBind(ScienceMovieEntity movieEntity) { + binding.setMovie(movieEntity); + binding.executePendingBindings(); + } + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListFragment.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListFragment.java new file mode 100644 index 0000000..df4c7f3 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListFragment.java @@ -0,0 +1,64 @@ +package iammert.com.androidarchitecture.ui.main.science; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.core.app.ActivityOptionsCompat; +import androidx.recyclerview.widget.GridLayoutManager; + +import iammert.com.androidarchitecture.R; +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; +import iammert.com.androidarchitecture.databinding.FragmentMovieListBinding; +import iammert.com.androidarchitecture.enums.MovieType; +import iammert.com.androidarchitecture.ui.BaseFragment; +import iammert.com.androidarchitecture.ui.detail.science.MovieScienceDetailActivity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class MovieScienceListFragment extends BaseFragment implements ScienceMovieListCallback { + + public static MovieScienceListFragment newInstance() { + Bundle args = new Bundle(); + MovieScienceListFragment fragment = new MovieScienceListFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + public Class getViewModel() { + return MovieScienceListViewModel.class; + } + + @Override + public int getLayoutRes() { + return R.layout.fragment_movie_list; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + dataBinding.recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2)); + dataBinding.recyclerView.setAdapter(new MovieScienceListAdapter(this)); + return dataBinding.getRoot(); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + viewModel.getScienceMovies() + .observe(getViewLifecycleOwner(), listResource -> dataBinding.setResource(listResource)); + } + + @Override + public void onMovieClicked(ScienceMovieEntity movieEntity, View sharedView) { + ActivityOptionsCompat options = ActivityOptionsCompat. + makeSceneTransitionAnimation(getActivity(), sharedView, getString(R.string.shared_image)); + startActivity(MovieScienceDetailActivity.newIntent(getActivity(), movieEntity.getId(), MovieType.SCIENCE), options.toBundle()); + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListViewModel.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListViewModel.java new file mode 100644 index 0000000..6d6d968 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/MovieScienceListViewModel.java @@ -0,0 +1,29 @@ +package iammert.com.androidarchitecture.ui.main.science; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import java.util.List; + +import javax.inject.Inject; + +import iammert.com.androidarchitecture.data.MovieRepository; +import iammert.com.androidarchitecture.data.Resource; +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public class MovieScienceListViewModel extends ViewModel { + private final LiveData>> scienceMovies; + + @Inject + public MovieScienceListViewModel(MovieRepository movieRepository) { + scienceMovies = movieRepository.loadScienceMovies(); + } + + LiveData>> getScienceMovies() { + return scienceMovies; + } +} diff --git a/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/ScienceMovieListCallback.java b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/ScienceMovieListCallback.java new file mode 100644 index 0000000..70a18a1 --- /dev/null +++ b/app/src/main/java/iammert/com/androidarchitecture/ui/main/science/ScienceMovieListCallback.java @@ -0,0 +1,13 @@ +package iammert.com.androidarchitecture.ui.main.science; + +import android.view.View; + +import iammert.com.androidarchitecture.data.local.entity.ScienceMovieEntity; + +/** + * Develop by mehmetbalbay on 09-08-2020. + */ + +public interface ScienceMovieListCallback { + void onMovieClicked(ScienceMovieEntity movieEntity, View sharedView); +} diff --git a/app/src/main/res/layout/activity_comedy_movie_detail.xml b/app/src/main/res/layout/activity_comedy_movie_detail.xml new file mode 100644 index 0000000..af1971f --- /dev/null +++ b/app/src/main/res/layout/activity_comedy_movie_detail.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_science_movie_detail.xml b/app/src/main/res/layout/activity_science_movie_detail.xml new file mode 100644 index 0000000..ca9d20c --- /dev/null +++ b/app/src/main/res/layout/activity_science_movie_detail.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_comedy_movie_list.xml b/app/src/main/res/layout/item_comedy_movie_list.xml new file mode 100644 index 0000000..48a8059 --- /dev/null +++ b/app/src/main/res/layout/item_comedy_movie_list.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_science_movie_list.xml b/app/src/main/res/layout/item_science_movie_list.xml new file mode 100644 index 0000000..e4ac77e --- /dev/null +++ b/app/src/main/res/layout/item_science_movie_list.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + +