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