Skip to content

Instantly share code, notes, and snippets.

@alfianyusufabdullah
Created July 1, 2021 08:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alfianyusufabdullah/e06506c45147280d9d341aba2dc153d1 to your computer and use it in GitHub Desktop.
Save alfianyusufabdullah/e06506c45147280d9d341aba2dc153d1 to your computer and use it in GitHub Desktop.
{"source":"beny","target":"beny","percentage":"86.0%","comparison":[{"token":"20","sourceFilename":"MovieAdapter.kt(1-71)","targetFilename":"MovieAdapter.kt(1-71)","sourceCode":"package com.beny.movieapp.data.source\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.vo.Resource\n\ninterface MovieDataSource {\n\n fun getAllMovies(owner: LifecycleOwner): LiveData<Resource<PagedList<MovieEntity>>>\n\n fun getMovie(movieId: String,owner: LifecycleOwner): LiveData<Resource<MovieEntity>>\n\n fun getAllTv(owner: LifecycleOwner): LiveData<Resource<PagedList<TvshowEntity>>>\n\n fun getTv(tvId: String,owner: LifecycleOwner): LiveData<Resource<TvshowEntity>>\n\n fun getFavoriteMovie(): LiveData<PagedList<MovieEntity>>\n\n fun getFavoriteTvshow(): LiveData<PagedList<TvshowEntity>>\n\n fun setFavoriteMovie(movie: MovieEntity, state: Boolean)\n\n fun setFavoriteTvshow(tvshow: TvshowEntity, state: Boolean)\n\n}\n","targetCode":"package com.beny.movieapp.data.source\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.vo.Resource\n\ninterface MovieDataSource {\n\n fun getAllMovies(owner: LifecycleOwner): LiveData<Resource<PagedList<MovieEntity>>>\n\n fun getMovie(movieId: String,owner: LifecycleOwner): LiveData<Resource<MovieEntity>>\n\n fun getAllTv(owner: LifecycleOwner): LiveData<Resource<PagedList<TvshowEntity>>>\n\n fun getTv(tvId: String,owner: LifecycleOwner): LiveData<Resource<TvshowEntity>>\n\n fun getFavoriteMovie(): LiveData<PagedList<MovieEntity>>\n\n fun getFavoriteTvshow(): LiveData<PagedList<TvshowEntity>>\n\n fun setFavoriteMovie(movie: MovieEntity, state: Boolean)\n\n fun setFavoriteTvshow(tvshow: TvshowEntity, state: Boolean)\n\n}\n"},{"token":"14","sourceFilename":"MovieFragment.kt(1-63)","targetFilename":"MovieFragment.kt(1-63)","sourceCode":"package com.beny.movieapp.data.source\n\nimport android.annotation.SuppressLint\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.paging.LivePagedListBuilder\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.LocalDataSource\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.remote.ApiResponse\nimport com.beny.movieapp.data.source.remote.RemoteDataSource\nimport com.beny.movieapp.data.source.remote.response.*\nimport com.beny.movieapp.utils.AppExecutors\nimport com.beny.movieapp.vo.Resource\nimport java.text.ParseException\nimport java.text.SimpleDateFormat\nimport java.util.*\nimport kotlin.collections.ArrayList\n\nclass MovieRepository private constructor(\n private val remoteDataSource: RemoteDataSource,\n private val localDataSource: LocalDataSource,\n private val appExecutors: AppExecutors\n) : MovieDataSource {\n\n companion object {\n\n @Volatile\n private var instance: MovieRepository? = null\n\n fun getInstance(\n remoteData: RemoteDataSource,\n localData: LocalDataSource,\n appExecutors: AppExecutors\n ): MovieRepository =\n instance ?: synchronized(this) {\n instance ?: MovieRepository(\n remoteData,\n localData,\n appExecutors\n ).apply { instance = this }\n }\n\n }\n\n override fun getAllMovies(owner: LifecycleOwner): LiveData<Resource<PagedList<MovieEntity>>> {\n return object :\n NetworkBoundResource<PagedList<MovieEntity>, List<MovieItem>>(appExecutors) {\n public override fun loadFromDB(): LiveData<PagedList<MovieEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getAllMovies(), config).build()\n }\n\n override fun shouldFetch(data: PagedList<MovieEntity>?): Boolean =\n data == null || data.isEmpty()\n\n public override fun createCall(): LiveData<ApiResponse<List<MovieItem>>> =\n remoteDataSource.getAllMovies(owner)\n\n public override fun saveCallResult(data: List<MovieItem>) {\n val movieList = ArrayList<MovieEntity>()\n\n for (response in data) {\n var releaseDate = \"\"\n if (response.releaseDate != null) {\n releaseDate = convertFormat(response.releaseDate)\n }\n val course = MovieEntity(\n response.id,\n response.title,\n response.overview,\n \"\",\n releaseDate,\n response.voteAverage,\n response.posterPath,\n false\n )\n movieList.add(course)\n }\n localDataSource.insertMovies(movieList)\n\n\n }\n }.asLiveData()\n }\n\n override fun getMovie(movieId: String, owner: LifecycleOwner): LiveData<Resource<MovieEntity>> {\n return object : NetworkBoundResource<MovieEntity, DetailMovieResponse>(appExecutors) {\n public override fun loadFromDB(): LiveData<MovieEntity> =\n localDataSource.getMovieDetail(movieId)\n\n override fun shouldFetch(data: MovieEntity?): Boolean =\n data?.genres == \"\" || data?.genres == null\n\n public override fun createCall(): LiveData<ApiResponse<DetailMovieResponse>> =\n remoteDataSource.getMovie(movieId, owner)\n\n public override fun saveCallResult(data: DetailMovieResponse) {\n val genresArr: ArrayList<String> = ArrayList()\n data.genres.forEach { genre ->\n genresArr.add(genre.name)\n }\n val genres = genresArr.joinToString(\",\")\n localDataSource.updateMovieGenres(data.id, genres)\n }\n }.asLiveData()\n }\n\n override fun getAllTv(owner: LifecycleOwner): LiveData<Resource<PagedList<TvshowEntity>>> {\n return object : NetworkBoundResource<PagedList<TvshowEntity>, List<TvItem>>(appExecutors) {\n public override fun loadFromDB(): LiveData<PagedList<TvshowEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getTvshow(), config).build()\n }\n\n override fun shouldFetch(data: PagedList<TvshowEntity>?): Boolean =\n data == null || data.isEmpty()\n\n public override fun createCall(): LiveData<ApiResponse<List<TvItem>>> =\n remoteDataSource.getAllTv(owner)\n\n public override fun saveCallResult(data: List<TvItem>) {\n val tvList = ArrayList<TvshowEntity>()\n for (response in data) {\n var releaseDate = \"\"\n if (response.firstAirDate != null) {\n releaseDate = convertFormat(response.firstAirDate)\n }\n\n val tv = TvshowEntity(\n response.id,\n response.name,\n response.overview,\n \"\",\n releaseDate,\n response.voteAverage,\n \"\",\n response.posterPath,\n false\n )\n tvList.add(tv)\n }\n\n localDataSource.insertTvshow(tvList)\n }\n }.asLiveData()\n }\n\n override fun getTv(tvId: String, owner: LifecycleOwner): LiveData<Resource<TvshowEntity>> {\n return object : NetworkBoundResource<TvshowEntity, DetailTvResponse>(appExecutors) {\n public override fun loadFromDB(): LiveData<TvshowEntity> =\n localDataSource.getTvShowDetail(tvId)\n\n override fun shouldFetch(data: TvshowEntity?): Boolean =\n data?.genres == \"\" || data?.genres == null || data.lastSeason == \"\"\n\n public override fun createCall(): LiveData<ApiResponse<DetailTvResponse>> =\n remoteDataSource.getTv(tvId, owner)\n\n public override fun saveCallResult(data: DetailTvResponse) {\n val genresArr: ArrayList<String> = ArrayList()\n data.genres.forEach { genre ->\n genresArr.add(genre.name)\n }\n\n val genres = genresArr.joinToString(\",\")\n val lastSeason = \"Season \" + data.lastEpisodeToAir.seasonNumber.toString()\n localDataSource.updateTvGenres(data.id, genres, lastSeason)\n }\n }.asLiveData()\n }\n\n override fun getFavoriteMovie(): LiveData<PagedList<MovieEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getFavoriteMovies(), config).build()\n }\n\n override fun getFavoriteTvshow(): LiveData<PagedList<TvshowEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getFavoriteTvshow(), config).build()\n }\n\n override fun setFavoriteMovie(movie: MovieEntity, state: Boolean) =\n appExecutors.diskIO().execute { localDataSource.setFavoriteMovie(movie, state) }\n\n override fun setFavoriteTvshow(tvshow: TvshowEntity, state: Boolean) =\n appExecutors.diskIO().execute { localDataSource.setFavoriteTvshow(tvshow, state) }\n\n @SuppressLint(\"SimpleDateFormat\")\n fun convertFormat(inputDate: String): String {\n val simpleDateFormat = SimpleDateFormat(\"yyyy-MM-dd\")\n var date: Date? = null\n try {\n date = simpleDateFormat.parse(inputDate)\n } catch (e: ParseException) {\n e.printStackTrace()\n }\n if (date == null) {\n return \"\"\n }\n val convetDateFormat = SimpleDateFormat(\"dd MMM yyyy\")\n return convetDateFormat.format(date)\n }\n\n\n}\n\n","targetCode":"package com.beny.movieapp.data.source\n\nimport android.annotation.SuppressLint\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.paging.LivePagedListBuilder\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.LocalDataSource\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.remote.ApiResponse\nimport com.beny.movieapp.data.source.remote.RemoteDataSource\nimport com.beny.movieapp.data.source.remote.response.*\nimport com.beny.movieapp.utils.AppExecutors\nimport com.beny.movieapp.vo.Resource\nimport java.text.ParseException\nimport java.text.SimpleDateFormat\nimport java.util.*\nimport kotlin.collections.ArrayList\n\nclass MovieRepository private constructor(\n private val remoteDataSource: RemoteDataSource,\n private val localDataSource: LocalDataSource,\n private val appExecutors: AppExecutors\n) : MovieDataSource {\n\n companion object {\n\n @Volatile\n private var instance: MovieRepository? = null\n\n fun getInstance(\n remoteData: RemoteDataSource,\n localData: LocalDataSource,\n appExecutors: AppExecutors\n ): MovieRepository =\n instance ?: synchronized(this) {\n instance ?: MovieRepository(\n remoteData,\n localData,\n appExecutors\n ).apply { instance = this }\n }\n\n }\n\n override fun getAllMovies(owner: LifecycleOwner): LiveData<Resource<PagedList<MovieEntity>>> {\n return object :\n NetworkBoundResource<PagedList<MovieEntity>, List<MovieItem>>(appExecutors) {\n public override fun loadFromDB(): LiveData<PagedList<MovieEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getAllMovies(), config).build()\n }\n\n override fun shouldFetch(data: PagedList<MovieEntity>?): Boolean =\n data == null || data.isEmpty()\n\n public override fun createCall(): LiveData<ApiResponse<List<MovieItem>>> =\n remoteDataSource.getAllMovies(owner)\n\n public override fun saveCallResult(data: List<MovieItem>) {\n val movieList = ArrayList<MovieEntity>()\n\n for (response in data) {\n var releaseDate = \"\"\n if (response.releaseDate != null) {\n releaseDate = convertFormat(response.releaseDate)\n }\n val course = MovieEntity(\n response.id,\n response.title,\n response.overview,\n \"\",\n releaseDate,\n response.voteAverage,\n response.posterPath,\n false\n )\n movieList.add(course)\n }\n localDataSource.insertMovies(movieList)\n\n\n }\n }.asLiveData()\n }\n\n override fun getMovie(movieId: String, owner: LifecycleOwner): LiveData<Resource<MovieEntity>> {\n return object : NetworkBoundResource<MovieEntity, DetailMovieResponse>(appExecutors) {\n public override fun loadFromDB(): LiveData<MovieEntity> =\n localDataSource.getMovieDetail(movieId)\n\n override fun shouldFetch(data: MovieEntity?): Boolean =\n data?.genres == \"\" || data?.genres == null\n\n public override fun createCall(): LiveData<ApiResponse<DetailMovieResponse>> =\n remoteDataSource.getMovie(movieId, owner)\n\n public override fun saveCallResult(data: DetailMovieResponse) {\n val genresArr: ArrayList<String> = ArrayList()\n data.genres.forEach { genre ->\n genresArr.add(genre.name)\n }\n val genres = genresArr.joinToString(\",\")\n localDataSource.updateMovieGenres(data.id, genres)\n }\n }.asLiveData()\n }\n\n override fun getAllTv(owner: LifecycleOwner): LiveData<Resource<PagedList<TvshowEntity>>> {\n return object : NetworkBoundResource<PagedList<TvshowEntity>, List<TvItem>>(appExecutors) {\n public override fun loadFromDB(): LiveData<PagedList<TvshowEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getTvshow(), config).build()\n }\n\n override fun shouldFetch(data: PagedList<TvshowEntity>?): Boolean =\n data == null || data.isEmpty()\n\n public override fun createCall(): LiveData<ApiResponse<List<TvItem>>> =\n remoteDataSource.getAllTv(owner)\n\n public override fun saveCallResult(data: List<TvItem>) {\n val tvList = ArrayList<TvshowEntity>()\n for (response in data) {\n var releaseDate = \"\"\n if (response.firstAirDate != null) {\n releaseDate = convertFormat(response.firstAirDate)\n }\n\n val tv = TvshowEntity(\n response.id,\n response.name,\n response.overview,\n \"\",\n releaseDate,\n response.voteAverage,\n \"\",\n response.posterPath,\n false\n )\n tvList.add(tv)\n }\n\n localDataSource.insertTvshow(tvList)\n }\n }.asLiveData()\n }\n\n override fun getTv(tvId: String, owner: LifecycleOwner): LiveData<Resource<TvshowEntity>> {\n return object : NetworkBoundResource<TvshowEntity, DetailTvResponse>(appExecutors) {\n public override fun loadFromDB(): LiveData<TvshowEntity> =\n localDataSource.getTvShowDetail(tvId)\n\n override fun shouldFetch(data: TvshowEntity?): Boolean =\n data?.genres == \"\" || data?.genres == null || data.lastSeason == \"\"\n\n public override fun createCall(): LiveData<ApiResponse<DetailTvResponse>> =\n remoteDataSource.getTv(tvId, owner)\n\n public override fun saveCallResult(data: DetailTvResponse) {\n val genresArr: ArrayList<String> = ArrayList()\n data.genres.forEach { genre ->\n genresArr.add(genre.name)\n }\n\n val genres = genresArr.joinToString(\",\")\n val lastSeason = \"Season \" + data.lastEpisodeToAir.seasonNumber.toString()\n localDataSource.updateTvGenres(data.id, genres, lastSeason)\n }\n }.asLiveData()\n }\n\n override fun getFavoriteMovie(): LiveData<PagedList<MovieEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getFavoriteMovies(), config).build()\n }\n\n override fun getFavoriteTvshow(): LiveData<PagedList<TvshowEntity>> {\n val config = PagedList.Config.Builder()\n .setEnablePlaceholders(false)\n .setInitialLoadSizeHint(4)\n .setPageSize(4)\n .build()\n return LivePagedListBuilder(localDataSource.getFavoriteTvshow(), config).build()\n }\n\n override fun setFavoriteMovie(movie: MovieEntity, state: Boolean) =\n appExecutors.diskIO().execute { localDataSource.setFavoriteMovie(movie, state) }\n\n override fun setFavoriteTvshow(tvshow: TvshowEntity, state: Boolean) =\n appExecutors.diskIO().execute { localDataSource.setFavoriteTvshow(tvshow, state) }\n\n @SuppressLint(\"SimpleDateFormat\")\n fun convertFormat(inputDate: String): String {\n val simpleDateFormat = SimpleDateFormat(\"yyyy-MM-dd\")\n var date: Date? = null\n try {\n date = simpleDateFormat.parse(inputDate)\n } catch (e: ParseException) {\n e.printStackTrace()\n }\n if (date == null) {\n return \"\"\n }\n val convetDateFormat = SimpleDateFormat(\"dd MMM yyyy\")\n return convetDateFormat.format(date)\n }\n\n\n}\n\n"},{"token":"10","sourceFilename":"MovieViewModel.kt(1-23)","targetFilename":"MovieViewModel.kt(1-23)","sourceCode":"package com.beny.movieapp.data.source\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MediatorLiveData\nimport com.beny.movieapp.data.source.remote.ApiResponse\nimport com.beny.movieapp.data.source.remote.StatusResponse\nimport com.beny.movieapp.utils.AppExecutors\nimport com.beny.movieapp.vo.Resource\n\nabstract class NetworkBoundResource<ResultType, RequestType>(private val mExecutors: AppExecutors) {\n\n private val result = MediatorLiveData<Resource<ResultType>>()\n\n init {\n result.value = Resource.loading(null)\n\n @Suppress(\"LeakingThis\")\n val dbSource = loadFromDB()\n\n result.addSource(dbSource) { data ->\n result.removeSource(dbSource)\n if (shouldFetch(data)) {\n fetchFromNetwork(dbSource)\n } else {\n result.addSource(dbSource) { newData ->\n result.value = Resource.success(newData)\n }\n }\n }\n }\n\n private fun onFetchFailed() {}\n\n protected abstract fun loadFromDB(): LiveData<ResultType>\n\n protected abstract fun shouldFetch(data: ResultType?): Boolean\n\n protected abstract fun createCall(): LiveData<ApiResponse<RequestType>>\n\n protected abstract fun saveCallResult(data: RequestType)\n\n private fun fetchFromNetwork(dbSource: LiveData<ResultType>) {\n\n val apiResponse = createCall()\n\n result.addSource(dbSource) { newData ->\n result.value = Resource.loading(newData)\n }\n result.addSource(apiResponse) { response ->\n result.removeSource(apiResponse)\n result.removeSource(dbSource)\n when (response.status) {\n StatusResponse.SUCCESS ->\n mExecutors.diskIO().execute {\n saveCallResult(response.body)\n mExecutors.mainThread().execute {\n result.addSource(loadFromDB()) { newData ->\n result.value = Resource.success(newData)\n }\n }\n }\n StatusResponse.EMPTY -> mExecutors.mainThread().execute {\n result.addSource(loadFromDB()) { newData ->\n result.value = Resource.success(newData)\n }\n }\n StatusResponse.ERROR -> {\n onFetchFailed()\n result.addSource(dbSource) { newData ->\n result.value = Resource.error(response.message, newData)\n }\n }\n }\n }\n }\n\n fun asLiveData(): LiveData<Resource<ResultType>> = result\n}\n","targetCode":"package com.beny.movieapp.data.source\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MediatorLiveData\nimport com.beny.movieapp.data.source.remote.ApiResponse\nimport com.beny.movieapp.data.source.remote.StatusResponse\nimport com.beny.movieapp.utils.AppExecutors\nimport com.beny.movieapp.vo.Resource\n\nabstract class NetworkBoundResource<ResultType, RequestType>(private val mExecutors: AppExecutors) {\n\n private val result = MediatorLiveData<Resource<ResultType>>()\n\n init {\n result.value = Resource.loading(null)\n\n @Suppress(\"LeakingThis\")\n val dbSource = loadFromDB()\n\n result.addSource(dbSource) { data ->\n result.removeSource(dbSource)\n if (shouldFetch(data)) {\n fetchFromNetwork(dbSource)\n } else {\n result.addSource(dbSource) { newData ->\n result.value = Resource.success(newData)\n }\n }\n }\n }\n\n private fun onFetchFailed() {}\n\n protected abstract fun loadFromDB(): LiveData<ResultType>\n\n protected abstract fun shouldFetch(data: ResultType?): Boolean\n\n protected abstract fun createCall(): LiveData<ApiResponse<RequestType>>\n\n protected abstract fun saveCallResult(data: RequestType)\n\n private fun fetchFromNetwork(dbSource: LiveData<ResultType>) {\n\n val apiResponse = createCall()\n\n result.addSource(dbSource) { newData ->\n result.value = Resource.loading(newData)\n }\n result.addSource(apiResponse) { response ->\n result.removeSource(apiResponse)\n result.removeSource(dbSource)\n when (response.status) {\n StatusResponse.SUCCESS ->\n mExecutors.diskIO().execute {\n saveCallResult(response.body)\n mExecutors.mainThread().execute {\n result.addSource(loadFromDB()) { newData ->\n result.value = Resource.success(newData)\n }\n }\n }\n StatusResponse.EMPTY -> mExecutors.mainThread().execute {\n result.addSource(loadFromDB()) { newData ->\n result.value = Resource.success(newData)\n }\n }\n StatusResponse.ERROR -> {\n onFetchFailed()\n result.addSource(dbSource) { newData ->\n result.value = Resource.error(response.message, newData)\n }\n }\n }\n }\n }\n\n fun asLiveData(): LiveData<Resource<ResultType>> = result\n}\n"},{"token":"14","sourceFilename":"MovieFavoriteActivity.kt(1-71)","targetFilename":"MovieFavoriteActivity.kt(1-71)","sourceCode":"package com.beny.movieapp.data.source.local\n\nimport androidx.lifecycle.LiveData\nimport androidx.paging.DataSource\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.local.room.MovieCatalogueDao\n\nclass LocalDataSource private constructor(private val mMovieCatalogueDao: MovieCatalogueDao) {\n companion object {\n private var INSTANCE: LocalDataSource? = null\n\n fun getInstance(academyDao: MovieCatalogueDao): LocalDataSource =\n INSTANCE ?: LocalDataSource(academyDao)\n }\n\n fun getAllMovies(): DataSource.Factory<Int, MovieEntity> = mMovieCatalogueDao.getMovies()\n\n fun getFavoriteMovies(): DataSource.Factory<Int, MovieEntity> = mMovieCatalogueDao.getFavoriteMovie()\n\n fun getTvshow(): DataSource.Factory<Int, TvshowEntity> = mMovieCatalogueDao.getTvshow()\n\n fun getFavoriteTvshow(): DataSource.Factory<Int, TvshowEntity> = mMovieCatalogueDao.getFavoriteTvshow()\n\n fun getMovieDetail(movieId: String): LiveData<MovieEntity> =\n mMovieCatalogueDao.getMovieDetail(movieId)\n\n fun getTvShowDetail(tvshowId: String): LiveData<TvshowEntity> =\n mMovieCatalogueDao.getTvShowDetail(tvshowId)\n\n fun insertMovies(movies: List<MovieEntity>) = mMovieCatalogueDao.insertMovies(movies)\n\n\n fun insertTvshow(tvshow: List<TvshowEntity>) = mMovieCatalogueDao.insertTvshow(tvshow)\n\n fun setFavoriteMovie(movie: MovieEntity, newState: Boolean) {\n movie.favorite = newState\n mMovieCatalogueDao.updateMovie(movie)\n }\n\n fun setFavoriteTvshow(tvshow: TvshowEntity, newState: Boolean) {\n tvshow.favorite = newState\n mMovieCatalogueDao.updateTv(tvshow)\n }\n\n fun updateMovieGenres(movieId: String, genres: String) {\n mMovieCatalogueDao.updateMovieGenres(movieId,genres)\n }\n\n fun updateTvGenres(tvshowId: String, genres: String,lastSeason : String) {\n mMovieCatalogueDao.updateTvGenres(tvshowId,genres,lastSeason)\n }\n\n\n\n}\n","targetCode":"package com.beny.movieapp.data.source.local\n\nimport androidx.lifecycle.LiveData\nimport androidx.paging.DataSource\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.local.room.MovieCatalogueDao\n\nclass LocalDataSource private constructor(private val mMovieCatalogueDao: MovieCatalogueDao) {\n companion object {\n private var INSTANCE: LocalDataSource? = null\n\n fun getInstance(academyDao: MovieCatalogueDao): LocalDataSource =\n INSTANCE ?: LocalDataSource(academyDao)\n }\n\n fun getAllMovies(): DataSource.Factory<Int, MovieEntity> = mMovieCatalogueDao.getMovies()\n\n fun getFavoriteMovies(): DataSource.Factory<Int, MovieEntity> = mMovieCatalogueDao.getFavoriteMovie()\n\n fun getTvshow(): DataSource.Factory<Int, TvshowEntity> = mMovieCatalogueDao.getTvshow()\n\n fun getFavoriteTvshow(): DataSource.Factory<Int, TvshowEntity> = mMovieCatalogueDao.getFavoriteTvshow()\n\n fun getMovieDetail(movieId: String): LiveData<MovieEntity> =\n mMovieCatalogueDao.getMovieDetail(movieId)\n\n fun getTvShowDetail(tvshowId: String): LiveData<TvshowEntity> =\n mMovieCatalogueDao.getTvShowDetail(tvshowId)\n\n fun insertMovies(movies: List<MovieEntity>) = mMovieCatalogueDao.insertMovies(movies)\n\n\n fun insertTvshow(tvshow: List<TvshowEntity>) = mMovieCatalogueDao.insertTvshow(tvshow)\n\n fun setFavoriteMovie(movie: MovieEntity, newState: Boolean) {\n movie.favorite = newState\n mMovieCatalogueDao.updateMovie(movie)\n }\n\n fun setFavoriteTvshow(tvshow: TvshowEntity, newState: Boolean) {\n tvshow.favorite = newState\n mMovieCatalogueDao.updateTv(tvshow)\n }\n\n fun updateMovieGenres(movieId: String, genres: String) {\n mMovieCatalogueDao.updateMovieGenres(movieId,genres)\n }\n\n fun updateTvGenres(tvshowId: String, genres: String,lastSeason : String) {\n mMovieCatalogueDao.updateTvGenres(tvshowId,genres,lastSeason)\n }\n\n\n\n}\n"},{"token":"14","sourceFilename":"AppExecutors.kt(3-40)","targetFilename":"AppExecutors.kt(3-40)","sourceCode":"package com.beny.movieapp.data.source.local.room\n\nimport androidx.lifecycle.LiveData\nimport androidx.paging.DataSource\nimport androidx.room.*\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\n\n@Dao\ninterface MovieCatalogueDao {\n @Query(\"SELECT * FROM movieentities\")\n fun getMovies(): DataSource.Factory<Int, MovieEntity>\n\n @Query(\"SELECT * FROM movieentities where favorite = 1\")\n fun getFavoriteMovie(): DataSource.Factory<Int, MovieEntity>\n\n\n @Query(\"SELECT * FROM tvshowentities\")\n fun getTvshow(): DataSource.Factory<Int, TvshowEntity>\n\n @Query(\"SELECT * FROM tvshowentities where favorite = 1\")\n fun getFavoriteTvshow(): DataSource.Factory<Int, TvshowEntity>\n\n @Transaction\n @Query(\"SELECT * FROM movieentities WHERE movieId = :movieId\")\n fun getMovieDetail(movieId: String): LiveData<MovieEntity>\n\n @Transaction\n @Query(\"SELECT * FROM tvshowentities WHERE tvshowId = :tvshowId\")\n fun getTvShowDetail(tvshowId: String): LiveData<TvshowEntity>\n\n @Insert(onConflict = OnConflictStrategy.IGNORE)\n fun insertMovies(movies: List<MovieEntity>)\n\n @Insert(onConflict = OnConflictStrategy.IGNORE)\n fun insertTvshow(tvshow: List<TvshowEntity>)\n\n @Update\n fun updateMovie(movie: MovieEntity)\n\n @Query(\"UPDATE movieentities SET genres = :genres WHERE movieId = :movieId\")\n fun updateMovieGenres(movieId: String,genres : String)\n\n @Update\n fun updateTv(tv: TvshowEntity)\n\n @Query(\"UPDATE tvshowentities SET genres = :genres , lastSeason = :lastSeason WHERE tvshowId = :tvshowId\")\n fun updateTvGenres(tvshowId: String,genres : String , lastSeason : String)\n}\n","targetCode":"package com.beny.movieapp.data.source.local.room\n\nimport androidx.lifecycle.LiveData\nimport androidx.paging.DataSource\nimport androidx.room.*\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\n\n@Dao\ninterface MovieCatalogueDao {\n @Query(\"SELECT * FROM movieentities\")\n fun getMovies(): DataSource.Factory<Int, MovieEntity>\n\n @Query(\"SELECT * FROM movieentities where favorite = 1\")\n fun getFavoriteMovie(): DataSource.Factory<Int, MovieEntity>\n\n\n @Query(\"SELECT * FROM tvshowentities\")\n fun getTvshow(): DataSource.Factory<Int, TvshowEntity>\n\n @Query(\"SELECT * FROM tvshowentities where favorite = 1\")\n fun getFavoriteTvshow(): DataSource.Factory<Int, TvshowEntity>\n\n @Transaction\n @Query(\"SELECT * FROM movieentities WHERE movieId = :movieId\")\n fun getMovieDetail(movieId: String): LiveData<MovieEntity>\n\n @Transaction\n @Query(\"SELECT * FROM tvshowentities WHERE tvshowId = :tvshowId\")\n fun getTvShowDetail(tvshowId: String): LiveData<TvshowEntity>\n\n @Insert(onConflict = OnConflictStrategy.IGNORE)\n fun insertMovies(movies: List<MovieEntity>)\n\n @Insert(onConflict = OnConflictStrategy.IGNORE)\n fun insertTvshow(tvshow: List<TvshowEntity>)\n\n @Update\n fun updateMovie(movie: MovieEntity)\n\n @Query(\"UPDATE movieentities SET genres = :genres WHERE movieId = :movieId\")\n fun updateMovieGenres(movieId: String,genres : String)\n\n @Update\n fun updateTv(tv: TvshowEntity)\n\n @Query(\"UPDATE tvshowentities SET genres = :genres , lastSeason = :lastSeason WHERE tvshowId = :tvshowId\")\n fun updateTvGenres(tvshowId: String,genres : String , lastSeason : String)\n}\n"},{"token":"10","sourceFilename":"DataDummy.kt(1-319)","targetFilename":"DataDummy.kt(1-319)","sourceCode":"package com.beny.movieapp.data.source.remote\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.beny.movieapp.data.source.remote.response.*\nimport com.beny.movieapp.data.source.remote.api.ApiHelper\n\nclass RemoteDataSource private constructor(private val apiHelper: ApiHelper) {\n\n companion object {\n\n @Volatile\n private var instance: RemoteDataSource? = null\n\n fun getInstance(helper: ApiHelper): RemoteDataSource =\n instance ?: synchronized(this) {\n instance ?: RemoteDataSource(helper).apply { instance = this }\n }\n }\n\n fun getAllTv(owner: LifecycleOwner): MutableLiveData<ApiResponse<List<TvItem>>> {\n\n val result = MutableLiveData<ApiResponse<List<TvItem>>>()\n val movieResponses = apiHelper.loadTvshow()\n movieResponses.observe(owner, { tv ->\n\n result.value = ApiResponse.success(tv)\n })\n\n return result\n }\n\n fun getTv(tvId: String,owner: LifecycleOwner): LiveData<ApiResponse<DetailTvResponse>> {\n\n val result = MutableLiveData<ApiResponse<DetailTvResponse>>()\n val movieResponses = apiHelper.loadDetailTv(tvId)\n movieResponses.observe(owner, { tv ->\n\n result.value = ApiResponse.success(tv)\n })\n\n return result\n }\n\n fun getAllMovies(owner: LifecycleOwner): MutableLiveData<ApiResponse<List<MovieItem>>> {\n\n val result = MutableLiveData<ApiResponse<List<MovieItem>>>()\n val movieResponses = apiHelper.loadMovies()\n movieResponses.observe(owner, { movie ->\n\n result.value = ApiResponse.success(movie)\n })\n\n return result\n }\n\n\n fun getMovie(movieId: String,owner: LifecycleOwner): LiveData<ApiResponse<DetailMovieResponse>> {\n\n\n val result = MutableLiveData<ApiResponse<DetailMovieResponse>>()\n val movieResponses = apiHelper.loadMovie(movieId)\n movieResponses.observe(owner, { movie ->\n\n result.value = ApiResponse.success(movie)\n })\n\n return result\n }\n\n}\n","targetCode":"package com.beny.movieapp.data.source.remote\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.beny.movieapp.data.source.remote.response.*\nimport com.beny.movieapp.data.source.remote.api.ApiHelper\n\nclass RemoteDataSource private constructor(private val apiHelper: ApiHelper) {\n\n companion object {\n\n @Volatile\n private var instance: RemoteDataSource? = null\n\n fun getInstance(helper: ApiHelper): RemoteDataSource =\n instance ?: synchronized(this) {\n instance ?: RemoteDataSource(helper).apply { instance = this }\n }\n }\n\n fun getAllTv(owner: LifecycleOwner): MutableLiveData<ApiResponse<List<TvItem>>> {\n\n val result = MutableLiveData<ApiResponse<List<TvItem>>>()\n val movieResponses = apiHelper.loadTvshow()\n movieResponses.observe(owner, { tv ->\n\n result.value = ApiResponse.success(tv)\n })\n\n return result\n }\n\n fun getTv(tvId: String,owner: LifecycleOwner): LiveData<ApiResponse<DetailTvResponse>> {\n\n val result = MutableLiveData<ApiResponse<DetailTvResponse>>()\n val movieResponses = apiHelper.loadDetailTv(tvId)\n movieResponses.observe(owner, { tv ->\n\n result.value = ApiResponse.success(tv)\n })\n\n return result\n }\n\n fun getAllMovies(owner: LifecycleOwner): MutableLiveData<ApiResponse<List<MovieItem>>> {\n\n val result = MutableLiveData<ApiResponse<List<MovieItem>>>()\n val movieResponses = apiHelper.loadMovies()\n movieResponses.observe(owner, { movie ->\n\n result.value = ApiResponse.success(movie)\n })\n\n return result\n }\n\n\n fun getMovie(movieId: String,owner: LifecycleOwner): LiveData<ApiResponse<DetailMovieResponse>> {\n\n\n val result = MutableLiveData<ApiResponse<DetailMovieResponse>>()\n val movieResponses = apiHelper.loadMovie(movieId)\n movieResponses.observe(owner, { movie ->\n\n result.value = ApiResponse.success(movie)\n })\n\n return result\n }\n\n}\n"},{"token":"10","sourceFilename":"TvshowViewModel.kt(1-20)","targetFilename":"TvshowViewModel.kt(1-20)","sourceCode":"package com.beny.movieapp.data.source.remote.api\n\nimport android.util.Log\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.beny.movieapp.data.source.remote.response.*\nimport com.beny.movieapp.utils.EspressoIdlingResource\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\n\nclass ApiHelper {\n\n companion object{\n private const val TAG = \"ApiHelper\"\n private const val PAGE = 1\n }\n\n fun loadTvshow(): LiveData<List<TvItem>> {\n\n val tvResults = MutableLiveData<List<TvItem>>()\n\n val client = ApiConfig.getApiService().getTvshow(PAGE)\n EspressoIdlingResource.increment()\n client.enqueue(object : Callback<TvResponse> {\n override fun onResponse(\n call: Call<TvResponse>,\n response: Response<TvResponse>\n ) {\n\n if (response.isSuccessful) {\n val tvList = response.body()?.results!!\n tvResults.postValue(tvList)\n Log.d(TAG, \"Sukses\")\n EspressoIdlingResource.decrement()\n } else {\n Log.e(TAG, \"onFailure.: ${response.message()}\")\n }\n }\n override fun onFailure(call: Call<TvResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return tvResults\n }\n\n fun loadDetailTv(tvId : String): LiveData<DetailTvResponse> {\n\n val tvResult = MutableLiveData<DetailTvResponse>()\n\n val client = ApiConfig.getApiService().getDetailTv(tvId)\n EspressoIdlingResource.increment()\n client.enqueue(object : Callback<DetailTvResponse> {\n override fun onResponse(\n call: Call<DetailTvResponse>,\n response: Response<DetailTvResponse>\n ) {\n val tvList = response.body()\n tvResult.postValue(tvList)\n Log.d(TAG, \"Sukses\")\n EspressoIdlingResource.decrement()\n\n }\n override fun onFailure(call: Call<DetailTvResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return tvResult\n }\n\n fun loadMovies(): LiveData<List<MovieItem>> {\n\n val movieResults = MutableLiveData<List<MovieItem>>()\n\n val client = ApiConfig.getApiService().getMovie(PAGE)\n\n EspressoIdlingResource.increment()\n\n client.enqueue(object : Callback<MovieResponse> {\n override fun onResponse(\n call: Call<MovieResponse>,\n response: Response<MovieResponse>\n ) {\n\n if (response.isSuccessful) {\n val movieList = response.body()?.results!!\n movieResults.postValue(movieList)\n Log.d(TAG, \"Sukses\")\n EspressoIdlingResource.decrement()\n } else {\n Log.e(TAG, \"onFailure.: ${response.message()}\")\n }\n }\n override fun onFailure(call: Call<MovieResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return movieResults\n }\n\n fun loadMovie(movieId : String): LiveData<DetailMovieResponse> {\n\n val movieResult = MutableLiveData<DetailMovieResponse>()\n\n val client = ApiConfig.getApiService().getDetailMovie(movieId)\n\n EspressoIdlingResource.increment()\n client.enqueue(object : Callback<DetailMovieResponse> {\n override fun onResponse(\n call: Call<DetailMovieResponse>,\n response: Response<DetailMovieResponse>\n ) {\n val movieList = response.body()\n movieResult.postValue(movieList)\n Log.d(TAG, \"Berhasil\")\n EspressoIdlingResource.decrement()\n\n }\n override fun onFailure(call: Call<DetailMovieResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return movieResult\n }\n\n\n}\n","targetCode":"package com.beny.movieapp.data.source.remote.api\n\nimport android.util.Log\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.beny.movieapp.data.source.remote.response.*\nimport com.beny.movieapp.utils.EspressoIdlingResource\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\n\nclass ApiHelper {\n\n companion object{\n private const val TAG = \"ApiHelper\"\n private const val PAGE = 1\n }\n\n fun loadTvshow(): LiveData<List<TvItem>> {\n\n val tvResults = MutableLiveData<List<TvItem>>()\n\n val client = ApiConfig.getApiService().getTvshow(PAGE)\n EspressoIdlingResource.increment()\n client.enqueue(object : Callback<TvResponse> {\n override fun onResponse(\n call: Call<TvResponse>,\n response: Response<TvResponse>\n ) {\n\n if (response.isSuccessful) {\n val tvList = response.body()?.results!!\n tvResults.postValue(tvList)\n Log.d(TAG, \"Sukses\")\n EspressoIdlingResource.decrement()\n } else {\n Log.e(TAG, \"onFailure.: ${response.message()}\")\n }\n }\n override fun onFailure(call: Call<TvResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return tvResults\n }\n\n fun loadDetailTv(tvId : String): LiveData<DetailTvResponse> {\n\n val tvResult = MutableLiveData<DetailTvResponse>()\n\n val client = ApiConfig.getApiService().getDetailTv(tvId)\n EspressoIdlingResource.increment()\n client.enqueue(object : Callback<DetailTvResponse> {\n override fun onResponse(\n call: Call<DetailTvResponse>,\n response: Response<DetailTvResponse>\n ) {\n val tvList = response.body()\n tvResult.postValue(tvList)\n Log.d(TAG, \"Sukses\")\n EspressoIdlingResource.decrement()\n\n }\n override fun onFailure(call: Call<DetailTvResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return tvResult\n }\n\n fun loadMovies(): LiveData<List<MovieItem>> {\n\n val movieResults = MutableLiveData<List<MovieItem>>()\n\n val client = ApiConfig.getApiService().getMovie(PAGE)\n\n EspressoIdlingResource.increment()\n\n client.enqueue(object : Callback<MovieResponse> {\n override fun onResponse(\n call: Call<MovieResponse>,\n response: Response<MovieResponse>\n ) {\n\n if (response.isSuccessful) {\n val movieList = response.body()?.results!!\n movieResults.postValue(movieList)\n Log.d(TAG, \"Sukses\")\n EspressoIdlingResource.decrement()\n } else {\n Log.e(TAG, \"onFailure.: ${response.message()}\")\n }\n }\n override fun onFailure(call: Call<MovieResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return movieResults\n }\n\n fun loadMovie(movieId : String): LiveData<DetailMovieResponse> {\n\n val movieResult = MutableLiveData<DetailMovieResponse>()\n\n val client = ApiConfig.getApiService().getDetailMovie(movieId)\n\n EspressoIdlingResource.increment()\n client.enqueue(object : Callback<DetailMovieResponse> {\n override fun onResponse(\n call: Call<DetailMovieResponse>,\n response: Response<DetailMovieResponse>\n ) {\n val movieList = response.body()\n movieResult.postValue(movieList)\n Log.d(TAG, \"Berhasil\")\n EspressoIdlingResource.decrement()\n\n }\n override fun onFailure(call: Call<DetailMovieResponse>, t: Throwable) {\n\n Log.e(TAG, \"onFailure: ${t.message.toString()}\")\n }\n })\n\n return movieResult\n }\n\n\n}\n"},{"token":"14","sourceFilename":"TvshowFavoriteActivity.kt(1-70)","targetFilename":"TvshowFavoriteActivity.kt(1-70)","sourceCode":"package com.beny.movieapp.data.source.remote.api\n\nimport com.beny.movieapp.data.source.remote.response.*\nimport retrofit2.Call\nimport retrofit2.http.GET\nimport retrofit2.http.Path\nimport retrofit2.http.Query\n\ninterface ApiService {\n @GET(\"movie/popular\")\n fun getMovie(\n @Query(\"page\") page: Int\n ): Call<MovieResponse>\n\n @GET(\"movie/{id}\")\n fun getDetailMovie(\n @Path(\"id\") id: String\n ): Call<DetailMovieResponse>\n\n @GET(\"tv/popular\")\n fun getTvshow(\n @Query(\"page\") page: Int\n ): Call<TvResponse>\n\n @GET(\"tv/{id}\")\n fun getDetailTv(\n @Path(\"id\") id: String\n ): Call<DetailTvResponse>\n}\n","targetCode":"package com.beny.movieapp.data.source.remote.api\n\nimport com.beny.movieapp.data.source.remote.response.*\nimport retrofit2.Call\nimport retrofit2.http.GET\nimport retrofit2.http.Path\nimport retrofit2.http.Query\n\ninterface ApiService {\n @GET(\"movie/popular\")\n fun getMovie(\n @Query(\"page\") page: Int\n ): Call<MovieResponse>\n\n @GET(\"movie/{id}\")\n fun getDetailMovie(\n @Path(\"id\") id: String\n ): Call<DetailMovieResponse>\n\n @GET(\"tv/popular\")\n fun getTvshow(\n @Query(\"page\") page: Int\n ): Call<TvResponse>\n\n @GET(\"tv/{id}\")\n fun getDetailTv(\n @Path(\"id\") id: String\n ): Call<DetailTvResponse>\n}\n"},{"token":"20","sourceFilename":"TvshowAdapter.kt(1-72)","targetFilename":"TvshowAdapter.kt(1-72)","sourceCode":"package com.beny.movieapp.detail\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.Toast\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.ViewModelProvider\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.databinding.ActivityDetailMovieBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\nclass DetailMovieActivity : AppCompatActivity() {\n\n companion object {\n const val EXTRA_MOVIE = \"extra_movie\"\n\n }\n\n private lateinit var activityDetailMovieBinding: ActivityDetailMovieBinding\n private lateinit var viewModel: DetailMovieViewModel\n private lateinit var movieEntity: MovieEntity\n private var menu: Menu? = null\n private var isReady = false\n\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n\n activityDetailMovieBinding = ActivityDetailMovieBinding.inflate(layoutInflater)\n setContentView(activityDetailMovieBinding.root)\n\n setSupportActionBar(activityDetailMovieBinding.toolbar)\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[DetailMovieViewModel::class.java]\n\n val extras = intent.extras\n if (extras != null) {\n val movieID = extras.getString(EXTRA_MOVIE)\n if (movieID != null) {\n viewModel.setSelectedMovie(movieID)\n\n viewModel.getMovie(this).observe(this, { movie ->\n if (movie != null) {\n when (movie.status) {\n Status.LOADING -> activityDetailMovieBinding.progressBar.visibility =\n View.VISIBLE\n Status.SUCCESS -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n populateMovie(movie.data!!)\n\n }\n Status.ERROR -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n }\n }\n\n }\n\n override fun onCreateOptionsMenu(menu: Menu): Boolean {\n menuInflater.inflate(R.menu.menu_detail, menu)\n this.menu = menu\n viewModel.getMovie(this).observe(this, { movie ->\n if (movie != null) {\n when (movie.status) {\n Status.LOADING -> activityDetailMovieBinding.progressBar.visibility =\n View.VISIBLE\n Status.SUCCESS -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n val newState = movie.data?.favorite\n\n if (newState != null) {\n setFavoriteState(newState)\n }\n\n isReady = true\n\n }\n Status.ERROR -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n return true\n\n }\n\n override fun onOptionsItemSelected(item: MenuItem): Boolean {\n if (item.itemId == R.id.action_favorite) {\n if (isReady)\n viewModel.setFavorite(this.movieEntity)\n return true\n }\n if (item.itemId == android.R.id.home) {\n finish()\n return true\n }\n return super.onOptionsItemSelected(item)\n }\n\n private fun setFavoriteState(state: Boolean) {\n if (menu == null) return\n val menuItem = menu?.findItem(R.id.action_favorite)\n if (state) {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_red)\n } else {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_border)\n }\n }\n\n private fun populateMovie(movieEntity: MovieEntity) {\n val baseurl = this.getString(R.string.base_poster_path)\n\n this.movieEntity = movieEntity\n\n Glide.with(applicationContext)\n .load(baseurl + movieEntity.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error)\n )\n .into(activityDetailMovieBinding.imgPoster)\n\n\n activityDetailMovieBinding.tvItemTitle.text = movieEntity.title\n activityDetailMovieBinding.tvItemDateRelease.text = movieEntity.releaseDate\n activityDetailMovieBinding.tvItemGenres.text = movieEntity.genres\n activityDetailMovieBinding.tvItemOverview.text = movieEntity.overview\n }\n}\n","targetCode":"package com.beny.movieapp.detail\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.Toast\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.ViewModelProvider\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.databinding.ActivityDetailMovieBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\nclass DetailMovieActivity : AppCompatActivity() {\n\n companion object {\n const val EXTRA_MOVIE = \"extra_movie\"\n\n }\n\n private lateinit var activityDetailMovieBinding: ActivityDetailMovieBinding\n private lateinit var viewModel: DetailMovieViewModel\n private lateinit var movieEntity: MovieEntity\n private var menu: Menu? = null\n private var isReady = false\n\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n\n activityDetailMovieBinding = ActivityDetailMovieBinding.inflate(layoutInflater)\n setContentView(activityDetailMovieBinding.root)\n\n setSupportActionBar(activityDetailMovieBinding.toolbar)\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[DetailMovieViewModel::class.java]\n\n val extras = intent.extras\n if (extras != null) {\n val movieID = extras.getString(EXTRA_MOVIE)\n if (movieID != null) {\n viewModel.setSelectedMovie(movieID)\n\n viewModel.getMovie(this).observe(this, { movie ->\n if (movie != null) {\n when (movie.status) {\n Status.LOADING -> activityDetailMovieBinding.progressBar.visibility =\n View.VISIBLE\n Status.SUCCESS -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n populateMovie(movie.data!!)\n\n }\n Status.ERROR -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n }\n }\n\n }\n\n override fun onCreateOptionsMenu(menu: Menu): Boolean {\n menuInflater.inflate(R.menu.menu_detail, menu)\n this.menu = menu\n viewModel.getMovie(this).observe(this, { movie ->\n if (movie != null) {\n when (movie.status) {\n Status.LOADING -> activityDetailMovieBinding.progressBar.visibility =\n View.VISIBLE\n Status.SUCCESS -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n val newState = movie.data?.favorite\n\n if (newState != null) {\n setFavoriteState(newState)\n }\n\n isReady = true\n\n }\n Status.ERROR -> {\n activityDetailMovieBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n return true\n\n }\n\n override fun onOptionsItemSelected(item: MenuItem): Boolean {\n if (item.itemId == R.id.action_favorite) {\n if (isReady)\n viewModel.setFavorite(this.movieEntity)\n return true\n }\n if (item.itemId == android.R.id.home) {\n finish()\n return true\n }\n return super.onOptionsItemSelected(item)\n }\n\n private fun setFavoriteState(state: Boolean) {\n if (menu == null) return\n val menuItem = menu?.findItem(R.id.action_favorite)\n if (state) {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_red)\n } else {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_border)\n }\n }\n\n private fun populateMovie(movieEntity: MovieEntity) {\n val baseurl = this.getString(R.string.base_poster_path)\n\n this.movieEntity = movieEntity\n\n Glide.with(applicationContext)\n .load(baseurl + movieEntity.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error)\n )\n .into(activityDetailMovieBinding.imgPoster)\n\n\n activityDetailMovieBinding.tvItemTitle.text = movieEntity.title\n activityDetailMovieBinding.tvItemDateRelease.text = movieEntity.releaseDate\n activityDetailMovieBinding.tvItemGenres.text = movieEntity.genres\n activityDetailMovieBinding.tvItemOverview.text = movieEntity.overview\n }\n}\n"},{"token":"14","sourceFilename":"TvshowFragment.kt(1-63)","targetFilename":"TvshowFragment.kt(1-63)","sourceCode":"package com.beny.movieapp.detail\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\nclass DetailMovieViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n private lateinit var movieId: String\n\n fun setSelectedMovie(movieId: String) {\n this.movieId = movieId\n }\n\n fun getMovie(owner: LifecycleOwner): LiveData<Resource<MovieEntity>> = movieCatalogueRepository.getMovie(this.movieId,owner)\n\n\n fun setFavorite(movieEntity: MovieEntity) {\n val newState = !movieEntity.favorite\n movieCatalogueRepository.setFavoriteMovie(movieEntity, newState)\n }\n}\n","targetCode":"package com.beny.movieapp.detail\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\nclass DetailMovieViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n private lateinit var movieId: String\n\n fun setSelectedMovie(movieId: String) {\n this.movieId = movieId\n }\n\n fun getMovie(owner: LifecycleOwner): LiveData<Resource<MovieEntity>> = movieCatalogueRepository.getMovie(this.movieId,owner)\n\n\n fun setFavorite(movieEntity: MovieEntity) {\n val newState = !movieEntity.favorite\n movieCatalogueRepository.setFavoriteMovie(movieEntity, newState)\n }\n}\n"},{"token":"38","sourceFilename":"DetailMovieActivity.kt(1-145)","targetFilename":"DetailMovieActivity.kt(1-145)","sourceCode":"package com.beny.movieapp.detail\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.ViewModelProvider\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.databinding.ActivityDetailTvshowBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\nclass DetailTvshowActivity : AppCompatActivity() {\n companion object {\n const val EXTRA_TVSHOW = \"extra_tvshow\"\n }\n\n private lateinit var activityDetailTvBinding: ActivityDetailTvshowBinding\n private lateinit var viewModel: DetailTvshowViewModel\n private lateinit var tvshowEntity: TvshowEntity\n private var menu: Menu? = null\n private var isReady = false\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n\n activityDetailTvBinding = ActivityDetailTvshowBinding.inflate(layoutInflater)\n setContentView(activityDetailTvBinding.root)\n\n setSupportActionBar(activityDetailTvBinding.toolbar)\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[DetailTvshowViewModel::class.java]\n\n val extras = intent.extras\n if (extras != null) {\n val tvID = extras.getString(EXTRA_TVSHOW)\n if (tvID != null) {\n viewModel.setSelectedTv(tvID)\n\n viewModel.getTvshow(this).observe(this, { tv ->\n if (tv != null) {\n when (tv.status) {\n Status.LOADING -> activityDetailTvBinding.progressBar.visibility =\n View.VISIBLE\n Status.SUCCESS -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n populateTv(tv.data!!)\n\n }\n Status.ERROR -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n }\n }\n\n }\n\n override fun onCreateOptionsMenu(menu: Menu): Boolean {\n menuInflater.inflate(R.menu.menu_detail, menu)\n this.menu = menu\n viewModel.getTvshow(this).observe(this, { tvshow ->\n if (tvshow != null) {\n when (tvshow.status) {\n Status.LOADING -> activityDetailTvBinding.progressBar.visibility = View.VISIBLE\n Status.SUCCESS -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n val newState = tvshow.data?.favorite\n\n if (newState != null) {\n setFavoriteState(newState)\n }\n isReady = true\n\n }\n Status.ERROR -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n return true\n\n }\n\n override fun onOptionsItemSelected(item: MenuItem): Boolean {\n if (item.itemId == R.id.action_favorite) {\n if (isReady)\n viewModel.setFavorite(this.tvshowEntity)\n return true\n }\n if (item.itemId == android.R.id.home) {\n finish()\n return true\n }\n return super.onOptionsItemSelected(item)\n }\n\n private fun setFavoriteState(state: Boolean) {\n if (menu == null) return\n val menuItem = menu?.findItem(R.id.action_favorite)\n if (state) {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_red)\n } else {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_border)\n }\n }\n\n private fun populateTv(tvshowEntity: TvshowEntity) {\n val baseurl = this.getString(R.string.base_poster_path)\n\n this.tvshowEntity = tvshowEntity\n\n Glide.with(applicationContext)\n .load(baseurl + tvshowEntity.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error)\n )\n .into(activityDetailTvBinding.imgPoster)\n\n activityDetailTvBinding.tvItemTitle.text = tvshowEntity.title\n activityDetailTvBinding.tvItemDateRelease.text = tvshowEntity.releaseDate\n activityDetailTvBinding.tvItemGenres.text = tvshowEntity.genres\n activityDetailTvBinding.tvItemOverview.text = tvshowEntity.overview\n activityDetailTvBinding.tvItemLastSesason.text = tvshowEntity.lastSeason\n }\n}\n","targetCode":"package com.beny.movieapp.detail\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.ViewModelProvider\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.databinding.ActivityDetailTvshowBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\nclass DetailTvshowActivity : AppCompatActivity() {\n companion object {\n const val EXTRA_TVSHOW = \"extra_tvshow\"\n }\n\n private lateinit var activityDetailTvBinding: ActivityDetailTvshowBinding\n private lateinit var viewModel: DetailTvshowViewModel\n private lateinit var tvshowEntity: TvshowEntity\n private var menu: Menu? = null\n private var isReady = false\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n\n activityDetailTvBinding = ActivityDetailTvshowBinding.inflate(layoutInflater)\n setContentView(activityDetailTvBinding.root)\n\n setSupportActionBar(activityDetailTvBinding.toolbar)\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[DetailTvshowViewModel::class.java]\n\n val extras = intent.extras\n if (extras != null) {\n val tvID = extras.getString(EXTRA_TVSHOW)\n if (tvID != null) {\n viewModel.setSelectedTv(tvID)\n\n viewModel.getTvshow(this).observe(this, { tv ->\n if (tv != null) {\n when (tv.status) {\n Status.LOADING -> activityDetailTvBinding.progressBar.visibility =\n View.VISIBLE\n Status.SUCCESS -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n populateTv(tv.data!!)\n\n }\n Status.ERROR -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n }\n }\n\n }\n\n override fun onCreateOptionsMenu(menu: Menu): Boolean {\n menuInflater.inflate(R.menu.menu_detail, menu)\n this.menu = menu\n viewModel.getTvshow(this).observe(this, { tvshow ->\n if (tvshow != null) {\n when (tvshow.status) {\n Status.LOADING -> activityDetailTvBinding.progressBar.visibility = View.VISIBLE\n Status.SUCCESS -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n val newState = tvshow.data?.favorite\n\n if (newState != null) {\n setFavoriteState(newState)\n }\n isReady = true\n\n }\n Status.ERROR -> {\n activityDetailTvBinding.progressBar.visibility = View.GONE\n Toast.makeText(this, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n return true\n\n }\n\n override fun onOptionsItemSelected(item: MenuItem): Boolean {\n if (item.itemId == R.id.action_favorite) {\n if (isReady)\n viewModel.setFavorite(this.tvshowEntity)\n return true\n }\n if (item.itemId == android.R.id.home) {\n finish()\n return true\n }\n return super.onOptionsItemSelected(item)\n }\n\n private fun setFavoriteState(state: Boolean) {\n if (menu == null) return\n val menuItem = menu?.findItem(R.id.action_favorite)\n if (state) {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_red)\n } else {\n menuItem?.icon = ContextCompat.getDrawable(this, R.drawable.ic_favorite_border)\n }\n }\n\n private fun populateTv(tvshowEntity: TvshowEntity) {\n val baseurl = this.getString(R.string.base_poster_path)\n\n this.tvshowEntity = tvshowEntity\n\n Glide.with(applicationContext)\n .load(baseurl + tvshowEntity.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error)\n )\n .into(activityDetailTvBinding.imgPoster)\n\n activityDetailTvBinding.tvItemTitle.text = tvshowEntity.title\n activityDetailTvBinding.tvItemDateRelease.text = tvshowEntity.releaseDate\n activityDetailTvBinding.tvItemGenres.text = tvshowEntity.genres\n activityDetailTvBinding.tvItemOverview.text = tvshowEntity.overview\n activityDetailTvBinding.tvItemLastSesason.text = tvshowEntity.lastSeason\n }\n}\n"},{"token":"10","sourceFilename":"DetailMovieViewModel.kt(1-24)","targetFilename":"DetailMovieViewModel.kt(1-24)","sourceCode":"package com.beny.movieapp.detail\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\nclass DetailTvshowViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n private lateinit var tvshowId: String\n\n fun setSelectedTv(tvshowId: String) {\n this.tvshowId = tvshowId\n }\n\n fun getTvshow(owner: LifecycleOwner): LiveData<Resource<TvshowEntity>> = movieCatalogueRepository.getTv(this.tvshowId,owner)\n\n fun setFavorite(tvshowEntity: TvshowEntity) {\n val newState = !tvshowEntity.favorite\n movieCatalogueRepository.setFavoriteTvshow(tvshowEntity, newState)\n }\n\n}\n","targetCode":"package com.beny.movieapp.detail\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\nclass DetailTvshowViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n private lateinit var tvshowId: String\n\n fun setSelectedTv(tvshowId: String) {\n this.tvshowId = tvshowId\n }\n\n fun getTvshow(owner: LifecycleOwner): LiveData<Resource<TvshowEntity>> = movieCatalogueRepository.getTv(this.tvshowId,owner)\n\n fun setFavorite(tvshowEntity: TvshowEntity) {\n val newState = !tvshowEntity.favorite\n movieCatalogueRepository.setFavoriteTvshow(tvshowEntity, newState)\n }\n\n}\n"},{"token":"38","sourceFilename":"DetailTvshowActivity.kt(1-140)","targetFilename":"DetailTvshowActivity.kt(1-140)","sourceCode":"package com.beny.movieapp.home\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.MenuItem\nimport com.google.android.material.bottomnavigation.BottomNavigationView\nimport com.beny.movieapp.R\nimport com.beny.movieapp.databinding.ActivityHomeBinding\nimport com.beny.movieapp.movie.MovieFavoriteActivity\nimport com.beny.movieapp.tvshow.TvshowFavoriteActivity\n\nclass HomeActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n val activityHomeBinding = ActivityHomeBinding.inflate(layoutInflater)\n setContentView(activityHomeBinding.root)\n\n val sectionsPagerAdapter = SectionsPagerAdapter(this, supportFragmentManager)\n activityHomeBinding.viewPager.adapter = sectionsPagerAdapter\n activityHomeBinding.tabs.setupWithViewPager(activityHomeBinding.viewPager)\n\n supportActionBar?.elevation = 0f\n\n activityHomeBinding.navigation.setOnNavigationItemSelectedListener(this)\n }\n\n override fun onNavigationItemSelected(item: MenuItem): Boolean {\n\n when(item.itemId) {\n R.id.nav_fav_movie ->\n {\n val i = Intent(applicationContext,MovieFavoriteActivity::class.java)\n startActivity(i)\n true\n }\n R.id.nav_fav_tv ->\n {\n val i = Intent(applicationContext,TvshowFavoriteActivity::class.java)\n startActivity(i)\n true\n }\n }\n return false\n }\n}\n","targetCode":"package com.beny.movieapp.home\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.MenuItem\nimport com.google.android.material.bottomnavigation.BottomNavigationView\nimport com.beny.movieapp.R\nimport com.beny.movieapp.databinding.ActivityHomeBinding\nimport com.beny.movieapp.movie.MovieFavoriteActivity\nimport com.beny.movieapp.tvshow.TvshowFavoriteActivity\n\nclass HomeActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n val activityHomeBinding = ActivityHomeBinding.inflate(layoutInflater)\n setContentView(activityHomeBinding.root)\n\n val sectionsPagerAdapter = SectionsPagerAdapter(this, supportFragmentManager)\n activityHomeBinding.viewPager.adapter = sectionsPagerAdapter\n activityHomeBinding.tabs.setupWithViewPager(activityHomeBinding.viewPager)\n\n supportActionBar?.elevation = 0f\n\n activityHomeBinding.navigation.setOnNavigationItemSelectedListener(this)\n }\n\n override fun onNavigationItemSelected(item: MenuItem): Boolean {\n\n when(item.itemId) {\n R.id.nav_fav_movie ->\n {\n val i = Intent(applicationContext,MovieFavoriteActivity::class.java)\n startActivity(i)\n true\n }\n R.id.nav_fav_tv ->\n {\n val i = Intent(applicationContext,TvshowFavoriteActivity::class.java)\n startActivity(i)\n true\n }\n }\n return false\n }\n}\n"},{"token":"10","sourceFilename":"DetailTvshowViewModel.kt(1-24)","targetFilename":"DetailTvshowViewModel.kt(1-24)","sourceCode":"package com.beny.movieapp.home\n\nimport android.content.Context\nimport androidx.annotation.StringRes\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport com.beny.movieapp.R\nimport com.beny.movieapp.movie.MovieFragment\nimport com.beny.movieapp.tvshow.TvshowFragment\n\nclass SectionsPagerAdapter(private val mContext: Context, fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n companion object {\n @StringRes\n private val TAB_TITLES = intArrayOf(R.string.movie, R.string.tv_show)\n }\n\n override fun getCount(): Int = 2\n\n override fun getItem(position: Int): Fragment =\n when (position) {\n 0 -> MovieFragment()\n 1 -> TvshowFragment()\n else -> Fragment()\n }\n\n override fun getPageTitle(position: Int): CharSequence = mContext.resources.getString(TAB_TITLES[position])\n\n}\n","targetCode":"package com.beny.movieapp.home\n\nimport android.content.Context\nimport androidx.annotation.StringRes\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport com.beny.movieapp.R\nimport com.beny.movieapp.movie.MovieFragment\nimport com.beny.movieapp.tvshow.TvshowFragment\n\nclass SectionsPagerAdapter(private val mContext: Context, fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n companion object {\n @StringRes\n private val TAB_TITLES = intArrayOf(R.string.movie, R.string.tv_show)\n }\n\n override fun getCount(): Int = 2\n\n override fun getItem(position: Int): Fragment =\n when (position) {\n 0 -> MovieFragment()\n 1 -> TvshowFragment()\n else -> Fragment()\n }\n\n override fun getPageTitle(position: Int): CharSequence = mContext.resources.getString(TAB_TITLES[position])\n\n}\n"},{"token":"20","sourceFilename":"MovieDataSource.kt(1-28)","targetFilename":"MovieDataSource.kt(1-28)","sourceCode":"package com.beny.movieapp.movie\n\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagedListAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.databinding.ItemMovieBinding\nimport com.beny.movieapp.detail.DetailMovieActivity\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\n\n\nclass MovieAdapter : PagedListAdapter<MovieEntity, MovieAdapter.MovieViewHolder>(DIFF_CALLBACK) {\n\n companion object {\n private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<MovieEntity>() {\n override fun areItemsTheSame(old: MovieEntity, new: MovieEntity): Boolean {\n return old.movieId == new.movieId\n }\n override fun areContentsTheSame(old: MovieEntity, new: MovieEntity): Boolean {\n return old == new\n }\n }\n }\n\n\n\n\n class MovieViewHolder(private val binding: ItemMovieBinding) : RecyclerView.ViewHolder(binding.root) {\n fun bind(movie: MovieEntity) {\n with(binding) {\n tvItemTitle.text = movie.title\n tvItemGenres.text = movie.genres\n tvItemDateRelease.text = movie.releaseDate\n tvItemScore.text = \"Score: \" + movie.voteAverage.toString()\n itemView.setOnClickListener {\n val intent = Intent(itemView.context, DetailMovieActivity::class.java)\n intent.putExtra(DetailMovieActivity.EXTRA_MOVIE, movie.movieId)\n itemView.context.startActivity(intent)\n }\n Glide.with(itemView.context)\n .load(root.resources.getString(R.string.base_poster_path) + movie.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error))\n .into(imgPoster)\n }\n }\n }\n\n fun getSwipedData(swipedPosition: Int): MovieEntity? = getItem(swipedPosition)\n\n override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {\n val itemsMovieBinding = ItemMovieBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n return MovieViewHolder(itemsMovieBinding)\n }\n\n override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {\n val movie = getItem(position)\n if (movie != null) {\n holder.bind(movie)\n }\n\n }\n\n\n}\n","targetCode":"package com.beny.movieapp.movie\n\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagedListAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.databinding.ItemMovieBinding\nimport com.beny.movieapp.detail.DetailMovieActivity\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\n\n\nclass MovieAdapter : PagedListAdapter<MovieEntity, MovieAdapter.MovieViewHolder>(DIFF_CALLBACK) {\n\n companion object {\n private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<MovieEntity>() {\n override fun areItemsTheSame(old: MovieEntity, new: MovieEntity): Boolean {\n return old.movieId == new.movieId\n }\n override fun areContentsTheSame(old: MovieEntity, new: MovieEntity): Boolean {\n return old == new\n }\n }\n }\n\n\n\n\n class MovieViewHolder(private val binding: ItemMovieBinding) : RecyclerView.ViewHolder(binding.root) {\n fun bind(movie: MovieEntity) {\n with(binding) {\n tvItemTitle.text = movie.title\n tvItemGenres.text = movie.genres\n tvItemDateRelease.text = movie.releaseDate\n tvItemScore.text = \"Score: \" + movie.voteAverage.toString()\n itemView.setOnClickListener {\n val intent = Intent(itemView.context, DetailMovieActivity::class.java)\n intent.putExtra(DetailMovieActivity.EXTRA_MOVIE, movie.movieId)\n itemView.context.startActivity(intent)\n }\n Glide.with(itemView.context)\n .load(root.resources.getString(R.string.base_poster_path) + movie.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error))\n .into(imgPoster)\n }\n }\n }\n\n fun getSwipedData(swipedPosition: Int): MovieEntity? = getItem(swipedPosition)\n\n override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {\n val itemsMovieBinding = ItemMovieBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n return MovieViewHolder(itemsMovieBinding)\n }\n\n override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {\n val movie = getItem(position)\n if (movie != null) {\n holder.bind(movie)\n }\n\n }\n\n\n}\n"},{"token":"22","sourceFilename":"NetworkBoundResource.kt(1-78)","targetFilename":"NetworkBoundResource.kt(1-78)","sourceCode":"package com.beny.movieapp.movie\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.View\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.snackbar.Snackbar\nimport com.beny.movieapp.R\nimport com.beny.movieapp.databinding.ActivityMovieFavoriteBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\n\nclass MovieFavoriteActivity : AppCompatActivity() {\n private lateinit var activityMovieFavoriteBinding: ActivityMovieFavoriteBinding\n\n private lateinit var viewModel: MovieViewModel\n private lateinit var movieAdapter: MovieAdapter\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n activityMovieFavoriteBinding = ActivityMovieFavoriteBinding.inflate(layoutInflater)\n setContentView(activityMovieFavoriteBinding.root)\n\n supportActionBar?.title = \"Favorite Movie\"\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n itemTouchHelper.attachToRecyclerView(activityMovieFavoriteBinding.rvMovie)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[MovieViewModel::class.java]\n\n movieAdapter = MovieAdapter()\n\n activityMovieFavoriteBinding.progressBar.visibility = View.VISIBLE\n viewModel.getFavoriteMovie().observe(this,{ movies->\n if (movies != null) {\n activityMovieFavoriteBinding.progressBar.visibility = View.GONE\n movieAdapter.submitList(movies)\n\n }\n })\n with(activityMovieFavoriteBinding.rvMovie) {\n this.layoutManager = LinearLayoutManager(context)\n this.setHasFixedSize(true)\n this.adapter = movieAdapter\n }\n\n\n }\n\n private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {\n override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)\n override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean = true\n override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n\n val swipedPosition = viewHolder.bindingAdapterPosition\n val movieEntity = movieAdapter.getSwipedData(swipedPosition)\n movieEntity?.let { viewModel.setFavoriteMovie(it) }\n val snackbar = Snackbar.make(activityMovieFavoriteBinding.root, R.string.message_undo, Snackbar.LENGTH_LONG)\n snackbar.setAction(R.string.message_ok) { _ ->\n movieEntity?.let { viewModel.setFavoriteMovie(it) }\n }\n snackbar.show()\n\n }\n })\n\n\n}\n","targetCode":"package com.beny.movieapp.movie\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.View\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.snackbar.Snackbar\nimport com.beny.movieapp.R\nimport com.beny.movieapp.databinding.ActivityMovieFavoriteBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\n\nclass MovieFavoriteActivity : AppCompatActivity() {\n private lateinit var activityMovieFavoriteBinding: ActivityMovieFavoriteBinding\n\n private lateinit var viewModel: MovieViewModel\n private lateinit var movieAdapter: MovieAdapter\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n activityMovieFavoriteBinding = ActivityMovieFavoriteBinding.inflate(layoutInflater)\n setContentView(activityMovieFavoriteBinding.root)\n\n supportActionBar?.title = \"Favorite Movie\"\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n itemTouchHelper.attachToRecyclerView(activityMovieFavoriteBinding.rvMovie)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[MovieViewModel::class.java]\n\n movieAdapter = MovieAdapter()\n\n activityMovieFavoriteBinding.progressBar.visibility = View.VISIBLE\n viewModel.getFavoriteMovie().observe(this,{ movies->\n if (movies != null) {\n activityMovieFavoriteBinding.progressBar.visibility = View.GONE\n movieAdapter.submitList(movies)\n\n }\n })\n with(activityMovieFavoriteBinding.rvMovie) {\n this.layoutManager = LinearLayoutManager(context)\n this.setHasFixedSize(true)\n this.adapter = movieAdapter\n }\n\n\n }\n\n private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {\n override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)\n override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean = true\n override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n\n val swipedPosition = viewHolder.bindingAdapterPosition\n val movieEntity = movieAdapter.getSwipedData(swipedPosition)\n movieEntity?.let { viewModel.setFavoriteMovie(it) }\n val snackbar = Snackbar.make(activityMovieFavoriteBinding.root, R.string.message_undo, Snackbar.LENGTH_LONG)\n snackbar.setAction(R.string.message_ok) { _ ->\n movieEntity?.let { viewModel.setFavoriteMovie(it) }\n }\n snackbar.show()\n\n }\n })\n\n\n}\n"},{"token":"69","sourceFilename":"MovieRepository.kt(1-223)","targetFilename":"MovieRepository.kt(1-223)","sourceCode":"package com.beny.movieapp.movie\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.beny.movieapp.databinding.FragmentMovieBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\nclass MovieFragment : Fragment() {\n private lateinit var fragmentMovieBinding: FragmentMovieBinding\n\n\n override fun onCreateView(\n inflater: LayoutInflater, container: ViewGroup?,\n savedInstanceState: Bundle?\n ): View {\n // Inflate the layout for this fragment\n fragmentMovieBinding = FragmentMovieBinding.inflate(layoutInflater, container, false)\n return fragmentMovieBinding.root\n }\n\n override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n if (activity != null) {\n val factory = ViewModelFactory.getInstance(requireActivity())\n val viewModel = ViewModelProvider(this, factory)[MovieViewModel::class.java]\n\n val movieAdapter = MovieAdapter()\n\n\n viewModel.getMovies(viewLifecycleOwner).observe(viewLifecycleOwner, { movies ->\n if (movies != null) {\n when (movies.status) {\n Status.LOADING -> fragmentMovieBinding.progressBar.visibility = View.VISIBLE\n Status.SUCCESS -> {\n fragmentMovieBinding.progressBar.visibility = View.GONE\n movieAdapter.submitList(movies.data)\n }\n Status.ERROR -> {\n fragmentMovieBinding.progressBar.visibility = View.GONE\n Toast.makeText(context, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n with(fragmentMovieBinding.rvMovie) {\n this.layoutManager = LinearLayoutManager(context)\n this.setHasFixedSize(true)\n this.adapter = movieAdapter\n }\n\n\n }\n }\n\n\n}\n","targetCode":"package com.beny.movieapp.movie\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.beny.movieapp.databinding.FragmentMovieBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\nclass MovieFragment : Fragment() {\n private lateinit var fragmentMovieBinding: FragmentMovieBinding\n\n\n override fun onCreateView(\n inflater: LayoutInflater, container: ViewGroup?,\n savedInstanceState: Bundle?\n ): View {\n // Inflate the layout for this fragment\n fragmentMovieBinding = FragmentMovieBinding.inflate(layoutInflater, container, false)\n return fragmentMovieBinding.root\n }\n\n override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n if (activity != null) {\n val factory = ViewModelFactory.getInstance(requireActivity())\n val viewModel = ViewModelProvider(this, factory)[MovieViewModel::class.java]\n\n val movieAdapter = MovieAdapter()\n\n\n viewModel.getMovies(viewLifecycleOwner).observe(viewLifecycleOwner, { movies ->\n if (movies != null) {\n when (movies.status) {\n Status.LOADING -> fragmentMovieBinding.progressBar.visibility = View.VISIBLE\n Status.SUCCESS -> {\n fragmentMovieBinding.progressBar.visibility = View.GONE\n movieAdapter.submitList(movies.data)\n }\n Status.ERROR -> {\n fragmentMovieBinding.progressBar.visibility = View.GONE\n Toast.makeText(context, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n with(fragmentMovieBinding.rvMovie) {\n this.layoutManager = LinearLayoutManager(context)\n this.setHasFixedSize(true)\n this.adapter = movieAdapter\n }\n\n\n }\n }\n\n\n}\n"},{"token":"30","sourceFilename":"LocalDataSource.kt(1-56)","targetFilename":"LocalDataSource.kt(1-56)","sourceCode":"package com.beny.movieapp.movie\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\n\nclass MovieViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n\n fun getMovies(owner: LifecycleOwner) : LiveData<Resource<PagedList<MovieEntity>>> = movieCatalogueRepository.getAllMovies(owner)\n\n fun getFavoriteMovie() : LiveData<PagedList<MovieEntity>> = movieCatalogueRepository.getFavoriteMovie()\n\n fun setFavoriteMovie(movieEntity: MovieEntity) {\n val newState = !movieEntity.favorite\n movieCatalogueRepository.setFavoriteMovie(movieEntity, newState)\n }\n\n}\n","targetCode":"package com.beny.movieapp.movie\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\n\nclass MovieViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n\n fun getMovies(owner: LifecycleOwner) : LiveData<Resource<PagedList<MovieEntity>>> = movieCatalogueRepository.getAllMovies(owner)\n\n fun getFavoriteMovie() : LiveData<PagedList<MovieEntity>> = movieCatalogueRepository.getFavoriteMovie()\n\n fun setFavoriteMovie(movieEntity: MovieEntity) {\n val newState = !movieEntity.favorite\n movieCatalogueRepository.setFavoriteMovie(movieEntity, newState)\n }\n\n}\n"},{"token":"28","sourceFilename":"MovieCatalogueDao.kt(1-49)","targetFilename":"MovieCatalogueDao.kt(1-49)","sourceCode":"package com.beny.movieapp.tvshow\n\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagedListAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.databinding.ItemTvshowBinding\nimport com.beny.movieapp.detail.DetailTvshowActivity\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\n\nclass TvshowAdapter : PagedListAdapter<TvshowEntity, TvshowAdapter.TvshowViewHolder>(DIFF_CALLBACK){\n\n companion object {\n private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<TvshowEntity>() {\n override fun areItemsTheSame(oldItem: TvshowEntity, newItem: TvshowEntity): Boolean {\n return oldItem.tvshowId == newItem.tvshowId\n }\n override fun areContentsTheSame(oldItem: TvshowEntity, newItem: TvshowEntity): Boolean {\n return oldItem == newItem\n }\n }\n }\n\n\n\n class TvshowViewHolder(private val binding: ItemTvshowBinding) : RecyclerView.ViewHolder(binding.root) {\n fun bind(tvshow: TvshowEntity) {\n with(binding) {\n tvItemTitle.text = tvshow.title\n tvItemGenres.text = tvshow.genres\n tvItemDateRelease.text = tvshow.releaseDate\n tvItemLastSesason.text = tvshow.lastSeason\n\n tvItemScore.text = \"Score: \" + tvshow.voteAverage.toString()\n\n itemView.setOnClickListener {\n val intent = Intent(itemView.context, DetailTvshowActivity::class.java)\n intent.putExtra(DetailTvshowActivity.EXTRA_TVSHOW, tvshow.tvshowId)\n itemView.context.startActivity(intent)\n }\n Glide.with(itemView.context)\n .load(root.resources.getString(R.string.base_poster_path)+ tvshow.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error))\n .into(imgPoster)\n }\n }\n }\n\n fun getSwipedData(swipedPosition: Int): TvshowEntity? = getItem(swipedPosition)\n\n override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TvshowViewHolder {\n val itemsTvshowBinding = ItemTvshowBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n return TvshowViewHolder(itemsTvshowBinding)\n }\n\n override fun onBindViewHolder(holder: TvshowViewHolder, position: Int) {\n val tv = getItem(position)\n if (tv != null) {\n holder.bind(tv)\n }\n\n }\n\n\n}\n","targetCode":"package com.beny.movieapp.tvshow\n\nimport android.content.Intent\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagedListAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.beny.movieapp.R\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.databinding.ItemTvshowBinding\nimport com.beny.movieapp.detail.DetailTvshowActivity\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\n\nclass TvshowAdapter : PagedListAdapter<TvshowEntity, TvshowAdapter.TvshowViewHolder>(DIFF_CALLBACK){\n\n companion object {\n private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<TvshowEntity>() {\n override fun areItemsTheSame(oldItem: TvshowEntity, newItem: TvshowEntity): Boolean {\n return oldItem.tvshowId == newItem.tvshowId\n }\n override fun areContentsTheSame(oldItem: TvshowEntity, newItem: TvshowEntity): Boolean {\n return oldItem == newItem\n }\n }\n }\n\n\n\n class TvshowViewHolder(private val binding: ItemTvshowBinding) : RecyclerView.ViewHolder(binding.root) {\n fun bind(tvshow: TvshowEntity) {\n with(binding) {\n tvItemTitle.text = tvshow.title\n tvItemGenres.text = tvshow.genres\n tvItemDateRelease.text = tvshow.releaseDate\n tvItemLastSesason.text = tvshow.lastSeason\n\n tvItemScore.text = \"Score: \" + tvshow.voteAverage.toString()\n\n itemView.setOnClickListener {\n val intent = Intent(itemView.context, DetailTvshowActivity::class.java)\n intent.putExtra(DetailTvshowActivity.EXTRA_TVSHOW, tvshow.tvshowId)\n itemView.context.startActivity(intent)\n }\n Glide.with(itemView.context)\n .load(root.resources.getString(R.string.base_poster_path)+ tvshow.posterPath)\n .apply(\n RequestOptions.placeholderOf(R.drawable.ic_loading)\n .error(R.drawable.ic_error))\n .into(imgPoster)\n }\n }\n }\n\n fun getSwipedData(swipedPosition: Int): TvshowEntity? = getItem(swipedPosition)\n\n override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TvshowViewHolder {\n val itemsTvshowBinding = ItemTvshowBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n return TvshowViewHolder(itemsTvshowBinding)\n }\n\n override fun onBindViewHolder(holder: TvshowViewHolder, position: Int) {\n val tv = getItem(position)\n if (tv != null) {\n holder.bind(tv)\n }\n\n }\n\n\n}\n"},{"token":"14","sourceFilename":"RemoteDataSource.kt(1-72)","targetFilename":"RemoteDataSource.kt(1-72)","sourceCode":"package com.beny.movieapp.tvshow\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.View\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.snackbar.Snackbar\nimport com.beny.movieapp.R\nimport com.beny.movieapp.databinding.ActivityTvshowFavoriteBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\n\nclass TvshowFavoriteActivity : AppCompatActivity() {\n\n private lateinit var activityTvshowFavoriteActivity: ActivityTvshowFavoriteBinding\n\n private lateinit var viewModel: TvshowViewModel\n private lateinit var tvshowAdapter: TvshowAdapter\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n activityTvshowFavoriteActivity = ActivityTvshowFavoriteBinding.inflate(layoutInflater)\n\n setContentView(activityTvshowFavoriteActivity.root)\n\n supportActionBar?.title = \"Favorite Tv Show\"\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n itemTouchHelper.attachToRecyclerView(activityTvshowFavoriteActivity.rvTvshow)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[TvshowViewModel::class.java]\n\n tvshowAdapter = TvshowAdapter()\n activityTvshowFavoriteActivity.progressBar.visibility = View.VISIBLE\n viewModel.getFavoriteTvshow().observe(this,{ tvshow->\n if (tvshow != null) {\n activityTvshowFavoriteActivity.progressBar.visibility = View.GONE\n tvshowAdapter.submitList(tvshow)\n\n }\n })\n with(activityTvshowFavoriteActivity.rvTvshow) {\n this.layoutManager = LinearLayoutManager(context)\n this.setHasFixedSize(true)\n this.adapter = tvshowAdapter\n }\n\n }\n\n private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {\n override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)\n override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean = true\n override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n\n val swipedPosition = viewHolder.adapterPosition\n val tvshowEntity = tvshowAdapter.getSwipedData(swipedPosition)\n tvshowEntity?.let { viewModel.setFavoriteTvshow(it) }\n val snackbar = Snackbar.make(activityTvshowFavoriteActivity.root, R.string.message_undo, Snackbar.LENGTH_LONG)\n snackbar.setAction(R.string.message_ok) { v ->\n tvshowEntity?.let { viewModel.setFavoriteTvshow(it) }\n }\n snackbar.show()\n\n }\n })\n}\n","targetCode":"package com.beny.movieapp.tvshow\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.View\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.snackbar.Snackbar\nimport com.beny.movieapp.R\nimport com.beny.movieapp.databinding.ActivityTvshowFavoriteBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\n\nclass TvshowFavoriteActivity : AppCompatActivity() {\n\n private lateinit var activityTvshowFavoriteActivity: ActivityTvshowFavoriteBinding\n\n private lateinit var viewModel: TvshowViewModel\n private lateinit var tvshowAdapter: TvshowAdapter\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n activityTvshowFavoriteActivity = ActivityTvshowFavoriteBinding.inflate(layoutInflater)\n\n setContentView(activityTvshowFavoriteActivity.root)\n\n supportActionBar?.title = \"Favorite Tv Show\"\n supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n itemTouchHelper.attachToRecyclerView(activityTvshowFavoriteActivity.rvTvshow)\n\n val factory = ViewModelFactory.getInstance(this)\n viewModel = ViewModelProvider(this, factory)[TvshowViewModel::class.java]\n\n tvshowAdapter = TvshowAdapter()\n activityTvshowFavoriteActivity.progressBar.visibility = View.VISIBLE\n viewModel.getFavoriteTvshow().observe(this,{ tvshow->\n if (tvshow != null) {\n activityTvshowFavoriteActivity.progressBar.visibility = View.GONE\n tvshowAdapter.submitList(tvshow)\n\n }\n })\n with(activityTvshowFavoriteActivity.rvTvshow) {\n this.layoutManager = LinearLayoutManager(context)\n this.setHasFixedSize(true)\n this.adapter = tvshowAdapter\n }\n\n }\n\n private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {\n override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int =\n makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)\n override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean = true\n override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n\n val swipedPosition = viewHolder.adapterPosition\n val tvshowEntity = tvshowAdapter.getSwipedData(swipedPosition)\n tvshowEntity?.let { viewModel.setFavoriteTvshow(it) }\n val snackbar = Snackbar.make(activityTvshowFavoriteActivity.root, R.string.message_undo, Snackbar.LENGTH_LONG)\n snackbar.setAction(R.string.message_ok) { v ->\n tvshowEntity?.let { viewModel.setFavoriteTvshow(it) }\n }\n snackbar.show()\n\n }\n })\n}\n"},{"token":"32","sourceFilename":"ApiHelper.kt(1-135)","targetFilename":"ApiHelper.kt(1-135)","sourceCode":"package com.beny.movieapp.tvshow\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.beny.movieapp.databinding.FragmentTvshowBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\n\nclass TvshowFragment : Fragment() {\n private lateinit var fragmentTvshowBinding: FragmentTvshowBinding\n\n override fun onCreateView(\n inflater: LayoutInflater, container: ViewGroup?,\n savedInstanceState: Bundle?\n ): View {\n // Inflate the layout for this fragment\n fragmentTvshowBinding = FragmentTvshowBinding.inflate(layoutInflater, container, false)\n return fragmentTvshowBinding.root\n }\n\n override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n if (activity != null) {\n val factory = ViewModelFactory.getInstance(requireActivity())\n val viewModel = ViewModelProvider(this, factory)[TvshowViewModel::class.java]\n\n\n val tvshowAdapter = TvshowAdapter()\n viewModel.getTvshows(viewLifecycleOwner).observe(viewLifecycleOwner, { tvshow ->\n if (tvshow != null) {\n when (tvshow.status) {\n Status.LOADING -> fragmentTvshowBinding.progressBar.visibility = View.VISIBLE\n Status.SUCCESS -> {\n fragmentTvshowBinding.progressBar.visibility = View.GONE\n tvshowAdapter.submitList(tvshow.data)\n }\n Status.ERROR -> {\n fragmentTvshowBinding.progressBar.visibility = View.GONE\n Toast.makeText(context, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n\n with(fragmentTvshowBinding.rvTvshow) {\n layoutManager = LinearLayoutManager(context)\n setHasFixedSize(true)\n adapter = tvshowAdapter\n }\n }\n }\n\n\n\n\n}\n","targetCode":"package com.beny.movieapp.tvshow\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.beny.movieapp.databinding.FragmentTvshowBinding\nimport com.beny.movieapp.viewmodel.ViewModelFactory\nimport com.beny.movieapp.vo.Status\n\n\nclass TvshowFragment : Fragment() {\n private lateinit var fragmentTvshowBinding: FragmentTvshowBinding\n\n override fun onCreateView(\n inflater: LayoutInflater, container: ViewGroup?,\n savedInstanceState: Bundle?\n ): View {\n // Inflate the layout for this fragment\n fragmentTvshowBinding = FragmentTvshowBinding.inflate(layoutInflater, container, false)\n return fragmentTvshowBinding.root\n }\n\n override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n if (activity != null) {\n val factory = ViewModelFactory.getInstance(requireActivity())\n val viewModel = ViewModelProvider(this, factory)[TvshowViewModel::class.java]\n\n\n val tvshowAdapter = TvshowAdapter()\n viewModel.getTvshows(viewLifecycleOwner).observe(viewLifecycleOwner, { tvshow ->\n if (tvshow != null) {\n when (tvshow.status) {\n Status.LOADING -> fragmentTvshowBinding.progressBar.visibility = View.VISIBLE\n Status.SUCCESS -> {\n fragmentTvshowBinding.progressBar.visibility = View.GONE\n tvshowAdapter.submitList(tvshow.data)\n }\n Status.ERROR -> {\n fragmentTvshowBinding.progressBar.visibility = View.GONE\n Toast.makeText(context, \"Terjadi kesalahan\", Toast.LENGTH_SHORT).show()\n }\n }\n }\n })\n\n with(fragmentTvshowBinding.rvTvshow) {\n layoutManager = LinearLayoutManager(context)\n setHasFixedSize(true)\n adapter = tvshowAdapter\n }\n }\n }\n\n\n\n\n}\n"},{"token":"12","sourceFilename":"ApiService.kt(1-29)","targetFilename":"ApiService.kt(1-29)","sourceCode":"package com.beny.movieapp.tvshow\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\nclass TvshowViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n\n fun getTvshows(owner: LifecycleOwner) : LiveData<Resource<PagedList<TvshowEntity>>> = movieCatalogueRepository.getAllTv(owner)\n fun getFavoriteTvshow() : LiveData<PagedList<TvshowEntity>> = movieCatalogueRepository.getFavoriteTvshow()\n\n fun setFavoriteTvshow(tvshowEntity: TvshowEntity) {\n val newState = !tvshowEntity.favorite\n movieCatalogueRepository.setFavoriteTvshow(tvshowEntity, newState)\n }\n}\n","targetCode":"package com.beny.movieapp.tvshow\n\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.paging.PagedList\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.vo.Resource\n\nclass TvshowViewModel(private val movieCatalogueRepository: MovieRepository) : ViewModel() {\n\n fun getTvshows(owner: LifecycleOwner) : LiveData<Resource<PagedList<TvshowEntity>>> = movieCatalogueRepository.getAllTv(owner)\n fun getFavoriteTvshow() : LiveData<PagedList<TvshowEntity>> = movieCatalogueRepository.getFavoriteTvshow()\n\n fun setFavoriteTvshow(tvshowEntity: TvshowEntity) {\n val newState = !tvshowEntity.favorite\n movieCatalogueRepository.setFavoriteTvshow(tvshowEntity, newState)\n }\n}\n"},{"token":"12","sourceFilename":"SectionsPagerAdapter.kt(1-29)","targetFilename":"SectionsPagerAdapter.kt(1-29)","sourceCode":"@file:Suppress(\"unused\")\n\n\npackage com.beny.movieapp.utils\n\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.annotation.VisibleForTesting\nimport java.util.concurrent.Executor\nimport java.util.concurrent.Executors\n\nclass AppExecutors @VisibleForTesting constructor(\n private val diskIO: Executor,\n private val networkIO: Executor,\n private val mainThread: Executor\n) {\n\n companion object {\n private const val THREAD_COUNT = 3\n }\n\n constructor() : this(\n Executors.newSingleThreadExecutor(),\n Executors.newFixedThreadPool(THREAD_COUNT),\n MainThreadExecutor()\n )\n\n fun diskIO(): Executor = diskIO\n\n fun networkIO(): Executor = networkIO\n\n fun mainThread(): Executor = mainThread\n\n private class MainThreadExecutor : Executor {\n private val mainThreadHandler = Handler(Looper.getMainLooper())\n\n override fun execute(command: Runnable) {\n mainThreadHandler.post(command)\n }\n }\n}\n","targetCode":"@file:Suppress(\"unused\")\n\n\npackage com.beny.movieapp.utils\n\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.annotation.VisibleForTesting\nimport java.util.concurrent.Executor\nimport java.util.concurrent.Executors\n\nclass AppExecutors @VisibleForTesting constructor(\n private val diskIO: Executor,\n private val networkIO: Executor,\n private val mainThread: Executor\n) {\n\n companion object {\n private const val THREAD_COUNT = 3\n }\n\n constructor() : this(\n Executors.newSingleThreadExecutor(),\n Executors.newFixedThreadPool(THREAD_COUNT),\n MainThreadExecutor()\n )\n\n fun diskIO(): Executor = diskIO\n\n fun networkIO(): Executor = networkIO\n\n fun mainThread(): Executor = mainThread\n\n private class MainThreadExecutor : Executor {\n private val mainThreadHandler = Handler(Looper.getMainLooper())\n\n override fun execute(command: Runnable) {\n mainThreadHandler.post(command)\n }\n }\n}\n"},{"token":"10","sourceFilename":"HomeActivity.kt(1-46)","targetFilename":"HomeActivity.kt(1-46)","sourceCode":"package com.beny.movieapp.utils\n\n\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.remote.response.MovieItem\nimport com.beny.movieapp.data.source.remote.response.TvItem\n\nobject DataDummy {\n fun generateMovies() : List<MovieEntity>{\n val movies = ArrayList<MovieEntity>()\n movies.add(\n MovieEntity(\"m1\",\n \"Luca\",\n \"Luca and his best friend Alberto experience an unforgettable summer on the Italian Riviera. But all the fun is threatened by a deeply-held secret: they are sea monsters from another world just below the water’s surface.\",\n \" Animation,Comedy,Family,Fantasy\",\n \"17 Jun 2021\",\n 7.2,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/5ghvx0Q5c57JoBNxFj4gSfXj6wK.jpg\")\n )\n movies.add(\n MovieEntity(\"m2\",\n \"The Maid\",\n \"An emotionally troubled teenager gets into a passionate relationship with the older French woman working in his father's house.\",\n \" Romance, Drama \",\n \"Apr 12, 2014\",\n 3.5,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/5YYtjXOOiQdCwwDZM2u9eueyWz8.jpg\")\n )\n movies.add(\n MovieEntity(\"m3\",\n \"Tom Clancy's Without Remorse\",\n \"An elite Navy SEAL uncovers an international conspiracy while seeking justice for the murder of his pregnant wife.\",\n \"Aksi, Cerita Seru, Kejahatan\",\n \"Apr 29, 2021\",\n 7.3,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/oRFMWkP33VY1tpPMRqK4oDmZunI.jpg\")\n )\n movies.add(\n MovieEntity(\"m4\",\n \"Godzilla vs. Kong\",\n \"In a time when monsters walk the Earth, humanity’s fight for its future sets Godzilla and Kong on a collision course that will see the two most powerful forces of nature on the planet collide in a spectacular battle for the ages.\",\n \"Cerita Fiksi, Aksi, Drama\",\n \"Mar 24, 2021\",\n 8.1,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/lrSjP0NS9urCQlSBaqs0kfmb5bY.jpg\")\n )\n movies.add(\n MovieEntity(\"m5\",\n \"Endangered Species\",\n \"Jack Halsey takes his wife, their adult kids, and a friend for a dream vacation in Kenya. But as they venture off alone into a wilderness park, their safari van is flipped over by an angry rhino, leaving them injured and desperat\",\n \"Aksi, Cerita Seru, Kejahatan, Komedi\\n\",\n \"Mei 28, 2021\",\n 6.7,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/ccsSqbpEqr2KK9eMvoeF8ERFCd5.jpg\")\n )\n movies.add(\n MovieEntity(\"m6\",\n \"The Unholy\",\n \"Alice, a young hearing-impaired girl who, after a supposed visitation from the Virgin Mary, is inexplicably able to hear, speak and heal the sick. As word spreads and people from near and far flock to witness her miracles, a disgraced journalist hoping to revive his career visits the small New England town to investigate. When terrifying events begin to happen all around, he starts to question if these phenomena are the works of the Virgin Mary or something much more sinister.\",\n \"Kengerian\",\n \"Mar 31, 2021\",\n 7.0,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/lcCKVNQKAqZlLI5qNRJK8MPahbI.jpg\")\n )\n movies.add(\n MovieEntity(\"m7\",\n \"I Am All Girls\",\n \"A special crimes investigator forms an unlikely bond with a serial killer to bring down a global child sex trafficking syndicate.\",\n \"Kejahatan, Drama, Misteri, Cerita Seru\",\n \"Mei 05, 2021\",\n 7.2,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/m6bUeV4mczG3z2YXXr5XDKPsQzv.jpg\")\n )\n movies.add(\n MovieEntity(\"m8\",\n \"Zack Snyder's Justice League\",\n \"Determined to ensure Superman's ultimate sacrifice was not in vain, Bruce Wayne aligns forces with Diana Prince with plans to recruit a team of metahumans to protect the world from an approaching threat of catastrophic proportions.\",\n \"Aksi, Petualangan, Fantasi, Cerita Fiksi\\n\",\n \"Mar 18, 2021\",\n 8.5,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/tnAuB8q5vv7Ax9UAEje5Xi4BXik.jpg\")\n )\n movies.add(\n MovieEntity(\"m9\",\n \"22 vs. Earth\",\n \"Set before the events of ‘Soul’, 22 refuses to go to Earth, enlisting a gang of 5 new souls in attempt of rebellion. However, 22’s subversive plot leads to a surprising revelation about the meaning of life\",\n \"Kejahatan, Drama, Misteri, Cerita Seru\",\n \"Apr 30, 2021\",\n 7.1,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/s9zJFEy4usXVFAa52AWT4ZCwR27.jpg\")\n )\n movies.add(\n MovieEntity(\"m10\",\n \"The Dry\",\n \"Aaron Falk returns to his drought-stricken hometown to attend a tragic funeral. But his return opens a decades-old wound - the unsolved death of a teenage girl\",\n \" Drama, Crime, Mystery, Thriller \",\n \"Mei 21, 2021\",\n 7.2,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/zM12bfL2TEqVRXjiQIFUWUMLcCg.jpg\")\n )\n\n return movies\n }\n\n fun genereteRemoteDummyMovies() : List<MovieItem>\n {\n val movies = ArrayList<MovieItem>()\n movies.add(MovieItem(\n \"Luca and his best friend Alberto experience an unforgettable summer on the Italian Riviera. But all the fun is threatened by a deeply-held secret: they are sea monsters from another world just below the water’s surface.\",\n \"en\",\n \"Luca\",\n false,\n \"Luca\",\n \"/4q2hz2m8hubgvijz8Ez0T2Os2Yv.jpg\",\n \"17 Jun 2021\",\n 4442.071,\n 7.3,\n \"520763\",\n false,\n 332,\n \"Animation,Comedy,Family,Fantasy\"\n ))\n movies.add(MovieItem(\n \"Tasha is a woman diagnosed with Congenital Insensitivity to Pain. This condition makes her incapable of feeling pain – be it physical or emotional pain. And because of her condition, she also has no idea how love works. \",\n \"ph\",\n \"Ang Babaeng Walang Pakiramdam\",\n false,\n \"Ang Babaeng Walang Pakiramdam\",\n \"/8DZ6YzyYyX4IAWcKlgW4pzMZ5AV.jpg\",\n \"2021-06-11\",\n 5055.01,\n 0.7,\n \"54\",\n false,\n 22,\n \"Animation,Comedy,Family,Fantasy\"\n ))\n\n movies.add(MovieItem(\n \"In 1970s London amidst the punk rock revolution, a young grifter named Estella is determined to make a name for herself with her designs. She befriends a pair of young thieves who appreciate her appetite for mischief, and together they are able to build a life for themselves on the London streets. One day, Estella’s flair for fashion catches the eye of the Baroness von Hellman, a fashion legend who is devastatingly chic and terrifyingly haute. But their relationship sets in motion a course of events and revelations that will cause Estella to embrace her wicked side and become the raucous, fashionable and revenge-bent Cruella.\",\n \"en\",\n \"Cruella\",\n false,\n \"Cruella\",\n \"/rTh4K5uw9HypmpGslcKd4QfHl93.jpg\",\n \"2021-05-26\",\n 4774.831,\n 8.6,\n \"337404\",\n false,\n 2664,\n \"Animation,Comedy,Family,Fantasy\"\n ))\n\n return movies\n }\n\n fun generateTvshows() : List<TvshowEntity> {\n val tvshows = ArrayList<TvshowEntity>()\n tvshows.add(\n TvshowEntity(\n \"t1\",\n \"Loki\",\n \"After stealing the Tesseract during the events of “Avengers: Endgame,” an alternate version of Loki is brought to the mysterious Time Variance Authority, a bureaucratic organization that exists outside of time and space and monitors the timeline. They give Loki a choice: face being erased from existence due to being a “time variant”or help fix the timeline and stop a greater threat.\",\n \" Drama,Sci-Fi & Fantasy\",\n \"09 Jun 2021\",\n 8.6,\n \"Season 1\",\n \"https://www.themoviedb.org/t/p/w130_and_h195_bestv2/wRbjVBdDo5qHAEOVYoMWpM58FSA.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t2\",\n \"Goblin\",\n \"In his quest for a bride to break his immortal curse, a 939-year-old guardian of souls meets a grim reaper and a sprightly student with a tragic p\",\n \" Drama, Sci-Fi & Fantasy \",\n \"Jul 15, 2016\",\n 8.7,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/c2gon6zbqzL73DOl8mPQMMUJXvE.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t3\",\n \"The Falcon and the Winter Soldier\",\n \"Following the events of “Avengers: Endgame”, the Falcon, Sam Wilson and the Winter Soldier, Bucky Barnes team up in a global adventure that tests their abilities, and their patience.\",\n \"Sci-fi & Fantasy\",\n \"Mar 19, 2021\",\n 7.7,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/6kbAMLteGO8yyewYau6bJ683sw7.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t4\",\n \"Grey's Anatomy\",\n \"Ikuti kehidupan pribadi dan profesional sekelompok dokter di Rumah Sakit Gray Sloan Memorial di Seattle.\",\n \"Drama\",\n \"Mar 27, 2005\",\n 8.2,\n \"Musim ke 17\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/clnyhPqj1SNgpAdeSS6a6fwE6Bo.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t5\",\n \"Lucifer\",\n \"Bosan dan tidak bahagia sebagai Penguasa Neraka, Lucifer Morningstar meninggalkan tahtanya dan pensiun ke Los Angeles, di mana ia telah bekerja sama dengan detektif LAPD Chloe Decker untuk menjatuhkan penjahat. Tapi semakin lama dia menjauh dari dunia bawah, semakin besar ancaman bahwa yang terburuk dari umat manusia dapat melarikan diri.\",\n \"Kejahatan, Sci-fi & Fantasy\",\n \"Jan 25, 2016\",\n 8.5,\n \"Musim ke 5\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/vkGnVBSNpayJ1oCfyVaMvhrim95.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t6\",\n \"Jupiter's Legacy\",\n \"As the world's first generation of superheroes (who received their powers in the 1930s) become the revered elder guard in the present, their superpowered children struggle to live up to the legendary feats of their parents\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Mei 07, 2021\",\n 7.4,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/9yxep7oJdkj3Pla9TD9gKflRApY.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t7\",\n \"The Bad Batch\",\n \"Follow the elite and experimental Clones of the Bad Batch as they find their way in a rapidly changing galaxy in the aftermath of the Clone Wars.\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Mei 04, 2021\",\n 8.9,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/uggL9jiDi0CCfoPIfU2X6BnMaFy.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t8\",\n \"Game of Thrones\",\n \"Tujuh keluarga bangsawan berjuang untuk menguasai tanah mitos Westeros. Gesekan antara rumah-rumah mengarah ke perang skala penuh. Semua sementara kejahatan yang sangat kuno terbangun di utara terjauh. Di tengah-tengah perang, perintah militer yang diabaikan, Night's Watch, adalah yang berdiri di antara alam manusia dan kengerian es di luarnya.\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Apr 17, 2011\",\n 8.4,\n \"Musim ke 8\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/u3bZgnGQ9T01sWNhyveQz0wH0Hl.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t9\",\n \"Traveling with the Derbez\",\n \"The series revolves around the Derbez family on their trip to Morocco, the family is made up of Eugenio Derbez, the patriarch of the family, Alessandra Rosaldo, his wife, Aitana Derbez, their daughter, Vadhir and José Eduardo Derbez, their children, and Aislinn Derbez, his eldest daughter.\",\n \"Documentary \",\n \"Jan 02, 2019\",\n 7.5,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/o1lAdiCYmCuDb25wyBCJQMeUhVA.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t10\",\n \"Jurassic World: Camp Cretaceous\",\n \"As the world's first generation of superheroes (who received their powers in the 1930s) become the revered elder guard in the present, their superpowered children struggle to live up to the legendary feats of their parents\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Sep 18, 2020\",\n 7.8,\n \"Musim ke 3\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/jWTDtbp2TnUGw1OJoDqq2O9IS0M.jpg\"\n )\n )\n\n return tvshows\n }\n\n fun genereteRemoteDummyTvshow() : List<TvItem>\n {\n val tv = ArrayList<TvItem>()\n tv.add(TvItem(\n \"/Afp8OhiO0Ajb3NPoCBvfu2pqaeO.jpg\",\n \"09 Jun 2021\",\n \"After stealing the Tesseract during the events of “Avengers: Endgame,” an alternate version of Loki is brought to the mysterious Time Variance Authority, a bureaucratic organization that exists outside of time and space and monitors the timeline. They give Loki a choice: face being erased from existence due to being a “time variant”or help fix the timeline and stop a greater threat.\",\n \"en\",\n 8.2,\n \"Loki\",\n \"Loki\",\n \"84958\",\n 7797,\n \"/lJA2RCMfsWoskqlQhXPSLFQGXEJ.jpg\",\n \"Season 1\",\n \"Drama,Sci-Fi & Fantasy\"\n\n ))\n tv.add(TvItem(\n \"/xpba0Dxz3sxV3QgYLR8UIe1LAAX.jpg\",\n \"2021-06-04\",\n \"On a perilous adventure across a post-apocalyptic world, a lovable boy who's half-human and half-deer searches for a new beginning with a gruff protector.\",\n \"en\",\n 8.0,\n \"Sweet Tooth\",\n \"Sweet Tooth\",\n \"103768\",\n 296,\n \"/rgMfhcrVZjuy5b7Pn0KzCRCEnMX.jpg\",\n \"Season 1\",\n \"Drama,Sci-Fi & Fantasy\"\n ))\n\n return tv\n }\n\n\n}\n","targetCode":"package com.beny.movieapp.utils\n\n\nimport com.beny.movieapp.data.source.local.entity.MovieEntity\nimport com.beny.movieapp.data.source.local.entity.TvshowEntity\nimport com.beny.movieapp.data.source.remote.response.MovieItem\nimport com.beny.movieapp.data.source.remote.response.TvItem\n\nobject DataDummy {\n fun generateMovies() : List<MovieEntity>{\n val movies = ArrayList<MovieEntity>()\n movies.add(\n MovieEntity(\"m1\",\n \"Luca\",\n \"Luca and his best friend Alberto experience an unforgettable summer on the Italian Riviera. But all the fun is threatened by a deeply-held secret: they are sea monsters from another world just below the water’s surface.\",\n \" Animation,Comedy,Family,Fantasy\",\n \"17 Jun 2021\",\n 7.2,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/5ghvx0Q5c57JoBNxFj4gSfXj6wK.jpg\")\n )\n movies.add(\n MovieEntity(\"m2\",\n \"The Maid\",\n \"An emotionally troubled teenager gets into a passionate relationship with the older French woman working in his father's house.\",\n \" Romance, Drama \",\n \"Apr 12, 2014\",\n 3.5,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/5YYtjXOOiQdCwwDZM2u9eueyWz8.jpg\")\n )\n movies.add(\n MovieEntity(\"m3\",\n \"Tom Clancy's Without Remorse\",\n \"An elite Navy SEAL uncovers an international conspiracy while seeking justice for the murder of his pregnant wife.\",\n \"Aksi, Cerita Seru, Kejahatan\",\n \"Apr 29, 2021\",\n 7.3,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/oRFMWkP33VY1tpPMRqK4oDmZunI.jpg\")\n )\n movies.add(\n MovieEntity(\"m4\",\n \"Godzilla vs. Kong\",\n \"In a time when monsters walk the Earth, humanity’s fight for its future sets Godzilla and Kong on a collision course that will see the two most powerful forces of nature on the planet collide in a spectacular battle for the ages.\",\n \"Cerita Fiksi, Aksi, Drama\",\n \"Mar 24, 2021\",\n 8.1,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/lrSjP0NS9urCQlSBaqs0kfmb5bY.jpg\")\n )\n movies.add(\n MovieEntity(\"m5\",\n \"Endangered Species\",\n \"Jack Halsey takes his wife, their adult kids, and a friend for a dream vacation in Kenya. But as they venture off alone into a wilderness park, their safari van is flipped over by an angry rhino, leaving them injured and desperat\",\n \"Aksi, Cerita Seru, Kejahatan, Komedi\\n\",\n \"Mei 28, 2021\",\n 6.7,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/ccsSqbpEqr2KK9eMvoeF8ERFCd5.jpg\")\n )\n movies.add(\n MovieEntity(\"m6\",\n \"The Unholy\",\n \"Alice, a young hearing-impaired girl who, after a supposed visitation from the Virgin Mary, is inexplicably able to hear, speak and heal the sick. As word spreads and people from near and far flock to witness her miracles, a disgraced journalist hoping to revive his career visits the small New England town to investigate. When terrifying events begin to happen all around, he starts to question if these phenomena are the works of the Virgin Mary or something much more sinister.\",\n \"Kengerian\",\n \"Mar 31, 2021\",\n 7.0,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/lcCKVNQKAqZlLI5qNRJK8MPahbI.jpg\")\n )\n movies.add(\n MovieEntity(\"m7\",\n \"I Am All Girls\",\n \"A special crimes investigator forms an unlikely bond with a serial killer to bring down a global child sex trafficking syndicate.\",\n \"Kejahatan, Drama, Misteri, Cerita Seru\",\n \"Mei 05, 2021\",\n 7.2,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/m6bUeV4mczG3z2YXXr5XDKPsQzv.jpg\")\n )\n movies.add(\n MovieEntity(\"m8\",\n \"Zack Snyder's Justice League\",\n \"Determined to ensure Superman's ultimate sacrifice was not in vain, Bruce Wayne aligns forces with Diana Prince with plans to recruit a team of metahumans to protect the world from an approaching threat of catastrophic proportions.\",\n \"Aksi, Petualangan, Fantasi, Cerita Fiksi\\n\",\n \"Mar 18, 2021\",\n 8.5,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/tnAuB8q5vv7Ax9UAEje5Xi4BXik.jpg\")\n )\n movies.add(\n MovieEntity(\"m9\",\n \"22 vs. Earth\",\n \"Set before the events of ‘Soul’, 22 refuses to go to Earth, enlisting a gang of 5 new souls in attempt of rebellion. However, 22’s subversive plot leads to a surprising revelation about the meaning of life\",\n \"Kejahatan, Drama, Misteri, Cerita Seru\",\n \"Apr 30, 2021\",\n 7.1,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/s9zJFEy4usXVFAa52AWT4ZCwR27.jpg\")\n )\n movies.add(\n MovieEntity(\"m10\",\n \"The Dry\",\n \"Aaron Falk returns to his drought-stricken hometown to attend a tragic funeral. But his return opens a decades-old wound - the unsolved death of a teenage girl\",\n \" Drama, Crime, Mystery, Thriller \",\n \"Mei 21, 2021\",\n 7.2,\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/zM12bfL2TEqVRXjiQIFUWUMLcCg.jpg\")\n )\n\n return movies\n }\n\n fun genereteRemoteDummyMovies() : List<MovieItem>\n {\n val movies = ArrayList<MovieItem>()\n movies.add(MovieItem(\n \"Luca and his best friend Alberto experience an unforgettable summer on the Italian Riviera. But all the fun is threatened by a deeply-held secret: they are sea monsters from another world just below the water’s surface.\",\n \"en\",\n \"Luca\",\n false,\n \"Luca\",\n \"/4q2hz2m8hubgvijz8Ez0T2Os2Yv.jpg\",\n \"17 Jun 2021\",\n 4442.071,\n 7.3,\n \"520763\",\n false,\n 332,\n \"Animation,Comedy,Family,Fantasy\"\n ))\n movies.add(MovieItem(\n \"Tasha is a woman diagnosed with Congenital Insensitivity to Pain. This condition makes her incapable of feeling pain – be it physical or emotional pain. And because of her condition, she also has no idea how love works. \",\n \"ph\",\n \"Ang Babaeng Walang Pakiramdam\",\n false,\n \"Ang Babaeng Walang Pakiramdam\",\n \"/8DZ6YzyYyX4IAWcKlgW4pzMZ5AV.jpg\",\n \"2021-06-11\",\n 5055.01,\n 0.7,\n \"54\",\n false,\n 22,\n \"Animation,Comedy,Family,Fantasy\"\n ))\n\n movies.add(MovieItem(\n \"In 1970s London amidst the punk rock revolution, a young grifter named Estella is determined to make a name for herself with her designs. She befriends a pair of young thieves who appreciate her appetite for mischief, and together they are able to build a life for themselves on the London streets. One day, Estella’s flair for fashion catches the eye of the Baroness von Hellman, a fashion legend who is devastatingly chic and terrifyingly haute. But their relationship sets in motion a course of events and revelations that will cause Estella to embrace her wicked side and become the raucous, fashionable and revenge-bent Cruella.\",\n \"en\",\n \"Cruella\",\n false,\n \"Cruella\",\n \"/rTh4K5uw9HypmpGslcKd4QfHl93.jpg\",\n \"2021-05-26\",\n 4774.831,\n 8.6,\n \"337404\",\n false,\n 2664,\n \"Animation,Comedy,Family,Fantasy\"\n ))\n\n return movies\n }\n\n fun generateTvshows() : List<TvshowEntity> {\n val tvshows = ArrayList<TvshowEntity>()\n tvshows.add(\n TvshowEntity(\n \"t1\",\n \"Loki\",\n \"After stealing the Tesseract during the events of “Avengers: Endgame,” an alternate version of Loki is brought to the mysterious Time Variance Authority, a bureaucratic organization that exists outside of time and space and monitors the timeline. They give Loki a choice: face being erased from existence due to being a “time variant”or help fix the timeline and stop a greater threat.\",\n \" Drama,Sci-Fi & Fantasy\",\n \"09 Jun 2021\",\n 8.6,\n \"Season 1\",\n \"https://www.themoviedb.org/t/p/w130_and_h195_bestv2/wRbjVBdDo5qHAEOVYoMWpM58FSA.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t2\",\n \"Goblin\",\n \"In his quest for a bride to break his immortal curse, a 939-year-old guardian of souls meets a grim reaper and a sprightly student with a tragic p\",\n \" Drama, Sci-Fi & Fantasy \",\n \"Jul 15, 2016\",\n 8.7,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/c2gon6zbqzL73DOl8mPQMMUJXvE.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t3\",\n \"The Falcon and the Winter Soldier\",\n \"Following the events of “Avengers: Endgame”, the Falcon, Sam Wilson and the Winter Soldier, Bucky Barnes team up in a global adventure that tests their abilities, and their patience.\",\n \"Sci-fi & Fantasy\",\n \"Mar 19, 2021\",\n 7.7,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/6kbAMLteGO8yyewYau6bJ683sw7.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t4\",\n \"Grey's Anatomy\",\n \"Ikuti kehidupan pribadi dan profesional sekelompok dokter di Rumah Sakit Gray Sloan Memorial di Seattle.\",\n \"Drama\",\n \"Mar 27, 2005\",\n 8.2,\n \"Musim ke 17\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/clnyhPqj1SNgpAdeSS6a6fwE6Bo.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t5\",\n \"Lucifer\",\n \"Bosan dan tidak bahagia sebagai Penguasa Neraka, Lucifer Morningstar meninggalkan tahtanya dan pensiun ke Los Angeles, di mana ia telah bekerja sama dengan detektif LAPD Chloe Decker untuk menjatuhkan penjahat. Tapi semakin lama dia menjauh dari dunia bawah, semakin besar ancaman bahwa yang terburuk dari umat manusia dapat melarikan diri.\",\n \"Kejahatan, Sci-fi & Fantasy\",\n \"Jan 25, 2016\",\n 8.5,\n \"Musim ke 5\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/vkGnVBSNpayJ1oCfyVaMvhrim95.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t6\",\n \"Jupiter's Legacy\",\n \"As the world's first generation of superheroes (who received their powers in the 1930s) become the revered elder guard in the present, their superpowered children struggle to live up to the legendary feats of their parents\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Mei 07, 2021\",\n 7.4,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/9yxep7oJdkj3Pla9TD9gKflRApY.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t7\",\n \"The Bad Batch\",\n \"Follow the elite and experimental Clones of the Bad Batch as they find their way in a rapidly changing galaxy in the aftermath of the Clone Wars.\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Mei 04, 2021\",\n 8.9,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/uggL9jiDi0CCfoPIfU2X6BnMaFy.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t8\",\n \"Game of Thrones\",\n \"Tujuh keluarga bangsawan berjuang untuk menguasai tanah mitos Westeros. Gesekan antara rumah-rumah mengarah ke perang skala penuh. Semua sementara kejahatan yang sangat kuno terbangun di utara terjauh. Di tengah-tengah perang, perintah militer yang diabaikan, Night's Watch, adalah yang berdiri di antara alam manusia dan kengerian es di luarnya.\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Apr 17, 2011\",\n 8.4,\n \"Musim ke 8\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/u3bZgnGQ9T01sWNhyveQz0wH0Hl.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t9\",\n \"Traveling with the Derbez\",\n \"The series revolves around the Derbez family on their trip to Morocco, the family is made up of Eugenio Derbez, the patriarch of the family, Alessandra Rosaldo, his wife, Aitana Derbez, their daughter, Vadhir and José Eduardo Derbez, their children, and Aislinn Derbez, his eldest daughter.\",\n \"Documentary \",\n \"Jan 02, 2019\",\n 7.5,\n \"Musim ke 1\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/o1lAdiCYmCuDb25wyBCJQMeUhVA.jpg\"\n )\n )\n tvshows.add(\n TvshowEntity(\n \"t10\",\n \"Jurassic World: Camp Cretaceous\",\n \"As the world's first generation of superheroes (who received their powers in the 1930s) become the revered elder guard in the present, their superpowered children struggle to live up to the legendary feats of their parents\",\n \"Sci-fi & Fantasy, Aksi \",\n \"Sep 18, 2020\",\n 7.8,\n \"Musim ke 3\",\n \"https://www.themoviedb.org/t/p/w220_and_h330_face/jWTDtbp2TnUGw1OJoDqq2O9IS0M.jpg\"\n )\n )\n\n return tvshows\n }\n\n fun genereteRemoteDummyTvshow() : List<TvItem>\n {\n val tv = ArrayList<TvItem>()\n tv.add(TvItem(\n \"/Afp8OhiO0Ajb3NPoCBvfu2pqaeO.jpg\",\n \"09 Jun 2021\",\n \"After stealing the Tesseract during the events of “Avengers: Endgame,” an alternate version of Loki is brought to the mysterious Time Variance Authority, a bureaucratic organization that exists outside of time and space and monitors the timeline. They give Loki a choice: face being erased from existence due to being a “time variant”or help fix the timeline and stop a greater threat.\",\n \"en\",\n 8.2,\n \"Loki\",\n \"Loki\",\n \"84958\",\n 7797,\n \"/lJA2RCMfsWoskqlQhXPSLFQGXEJ.jpg\",\n \"Season 1\",\n \"Drama,Sci-Fi & Fantasy\"\n\n ))\n tv.add(TvItem(\n \"/xpba0Dxz3sxV3QgYLR8UIe1LAAX.jpg\",\n \"2021-06-04\",\n \"On a perilous adventure across a post-apocalyptic world, a lovable boy who's half-human and half-deer searches for a new beginning with a gruff protector.\",\n \"en\",\n 8.0,\n \"Sweet Tooth\",\n \"Sweet Tooth\",\n \"103768\",\n 296,\n \"/rgMfhcrVZjuy5b7Pn0KzCRCEnMX.jpg\",\n \"Season 1\",\n \"Drama,Sci-Fi & Fantasy\"\n ))\n\n return tv\n }\n\n\n}\n"},{"token":"10","sourceFilename":"Resource.kt(1-11)","targetFilename":"Resource.kt(1-11)","sourceCode":"package com.beny.movieapp.viewmodel\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.detail.DetailMovieViewModel\nimport com.beny.movieapp.detail.DetailTvshowViewModel\nimport com.beny.movieapp.di.Injection\nimport com.beny.movieapp.movie.MovieViewModel\nimport com.beny.movieapp.tvshow.TvshowViewModel\n\nclass ViewModelFactory private constructor(private val mMovieCatalogueRepository: MovieRepository) : ViewModelProvider.NewInstanceFactory() {\n\n companion object {\n @Volatile\n private var instance: ViewModelFactory? = null\n\n fun getInstance(context: Context): ViewModelFactory =\n instance ?: synchronized(this) {\n instance ?: ViewModelFactory(Injection.provideRepository(context)).apply {\n instance = this\n }\n }\n }\n\n @Suppress(\"UNCHECKED_CAST\")\n override fun <T : ViewModel> create(modelClass: Class<T>): T {\n when {\n modelClass.isAssignableFrom(MovieViewModel::class.java) -> {\n return MovieViewModel(mMovieCatalogueRepository) as T\n }\n modelClass.isAssignableFrom(DetailMovieViewModel::class.java) -> {\n return DetailMovieViewModel(mMovieCatalogueRepository) as T\n }\n modelClass.isAssignableFrom(TvshowViewModel::class.java) -> {\n return TvshowViewModel(mMovieCatalogueRepository) as T\n }\n modelClass.isAssignableFrom(DetailTvshowViewModel::class.java) -> {\n return DetailTvshowViewModel(mMovieCatalogueRepository) as T\n }\n\n else -> throw Throwable(\"Unknown ViewModel class: \" + modelClass.name)\n }\n\n }\n}\n","targetCode":"package com.beny.movieapp.viewmodel\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport com.beny.movieapp.data.source.MovieRepository\nimport com.beny.movieapp.detail.DetailMovieViewModel\nimport com.beny.movieapp.detail.DetailTvshowViewModel\nimport com.beny.movieapp.di.Injection\nimport com.beny.movieapp.movie.MovieViewModel\nimport com.beny.movieapp.tvshow.TvshowViewModel\n\nclass ViewModelFactory private constructor(private val mMovieCatalogueRepository: MovieRepository) : ViewModelProvider.NewInstanceFactory() {\n\n companion object {\n @Volatile\n private var instance: ViewModelFactory? = null\n\n fun getInstance(context: Context): ViewModelFactory =\n instance ?: synchronized(this) {\n instance ?: ViewModelFactory(Injection.provideRepository(context)).apply {\n instance = this\n }\n }\n }\n\n @Suppress(\"UNCHECKED_CAST\")\n override fun <T : ViewModel> create(modelClass: Class<T>): T {\n when {\n modelClass.isAssignableFrom(MovieViewModel::class.java) -> {\n return MovieViewModel(mMovieCatalogueRepository) as T\n }\n modelClass.isAssignableFrom(DetailMovieViewModel::class.java) -> {\n return DetailMovieViewModel(mMovieCatalogueRepository) as T\n }\n modelClass.isAssignableFrom(TvshowViewModel::class.java) -> {\n return TvshowViewModel(mMovieCatalogueRepository) as T\n }\n modelClass.isAssignableFrom(DetailTvshowViewModel::class.java) -> {\n return DetailTvshowViewModel(mMovieCatalogueRepository) as T\n }\n\n else -> throw Throwable(\"Unknown ViewModel class: \" + modelClass.name)\n }\n\n }\n}\n"},{"token":"10","sourceFilename":"ViewModelFactory.kt(1-47)","targetFilename":"ViewModelFactory.kt(1-47)","sourceCode":"package com.beny.movieapp.vo\n\ndata class Resource<T>(val status: Status, val data: T?, val message: String?) {\n companion object {\n fun <T> success(data: T?): Resource<T> = Resource(Status.SUCCESS, data, null)\n\n fun <T> error(msg: String?, data: T?): Resource<T> = Resource(Status.ERROR, data, msg)\n\n fun <T> loading(data: T?): Resource<T> = Resource(Status.LOADING, data, null)\n }\n}\n","targetCode":"package com.beny.movieapp.vo\n\ndata class Resource<T>(val status: Status, val data: T?, val message: String?) {\n companion object {\n fun <T> success(data: T?): Resource<T> = Resource(Status.SUCCESS, data, null)\n\n fun <T> error(msg: String?, data: T?): Resource<T> = Resource(Status.ERROR, data, msg)\n\n fun <T> loading(data: T?): Resource<T> = Resource(Status.LOADING, data, null)\n }\n}\n"}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment