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