Skip to content

Commit

Permalink
fav feature implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
shalenMathew committed Jun 3, 2024
1 parent dd401ad commit c5cc345
Show file tree
Hide file tree
Showing 21 changed files with 449 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.example.movieflix.core.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.movieflix.R
import com.example.movieflix.core.utils.Constants
import com.example.movieflix.core.utils.isNetworkAvailable
import com.example.movieflix.core.utils.loadImage
import com.example.movieflix.data.local.entity.FavouritesEntity
import com.example.movieflix.data.local.entity.WatchListEntity
import com.example.movieflix.databinding.ItemListBinding
import com.example.movieflix.domain.model.MovieResult

class FavAdapters(private var onPosterClick: ((movieResult: MovieResult) -> Unit)):
ListAdapter<FavouritesEntity,FavAdapters.ViewHolder >(DiffUtilCallback()) {
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
var binding: ItemListBinding
init {
binding = ItemListBinding.bind(itemView)
}
fun bind(favouritesEntity: FavouritesEntity)=binding.apply{

val item = favouritesEntity.movieResult
itemListPoster.loadImage(Constants.TMDB_POSTER_IMAGE_BASE_URL_W342.plus(item.posterPath))
itemListRatingTxt.text = String.format("%.1f", item.voteAverage)

root.setOnClickListener(){
if (isNetworkAvailable(root.context)){
onPosterClick(item)
}else{
Toast.makeText(root.context, "Internet req", Toast.LENGTH_SHORT).show()
}
}
}
}


class DiffUtilCallback : DiffUtil.ItemCallback<FavouritesEntity>() {
override fun areItemsTheSame(
oldItem: FavouritesEntity,
newItem: FavouritesEntity
): Boolean {
return oldItem == newItem
}

override fun areContentsTheSame(
oldItem: FavouritesEntity,
newItem: FavouritesEntity
): Boolean {
return oldItem == newItem
}

}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_list,parent,false)
return ViewHolder(view)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ import android.content.Context
import androidx.room.Room
import com.example.movieflix.core.utils.Constants
import com.example.movieflix.core.utils.GsonParser
import com.example.movieflix.core.utils.MIGRATION_2_3
import com.example.movieflix.data.local.LocalDataSource
import com.example.movieflix.data.local.MovieDao
import com.example.movieflix.data.local.MovieDataTypeConverter
import com.example.movieflix.data.local.MovieDatabase
import com.example.movieflix.data.remote.RemoteDataSource
import com.example.movieflix.data.repository.FavMovieRepositoryImpl
import com.example.movieflix.data.repository.MovieInfoRepositoryImpl
import com.example.movieflix.data.repository.WatchListRepositoryImpl
import com.example.movieflix.domain.repository.FavMovieRepository
import com.example.movieflix.domain.repository.MovieInfoRepository
import com.example.movieflix.domain.repository.WatchListRepository
import com.google.gson.Gson
Expand All @@ -30,7 +33,8 @@ object DatabaseModule {
@Singleton
fun providesMovieDataBase(@ApplicationContext context: Context): MovieDatabase {
return Room.databaseBuilder(context,MovieDatabase::class.java,Constants.DATABASE_NAME)
.fallbackToDestructiveMigration()
// .fallbackToDestructiveMigration()
.addMigrations(MIGRATION_2_3)
.addTypeConverter(MovieDataTypeConverter(GsonParser(Gson())))
.build()
}
Expand All @@ -57,4 +61,10 @@ object DatabaseModule {
return WatchListRepositoryImpl(localDataSource)
}

@Provides
@Singleton
fun getFavMovie(localDataSource: LocalDataSource):FavMovieRepository{
return FavMovieRepositoryImpl(localDataSource)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ object Constants {
const val DATABASE_NAME = "movie_data_database"
const val TABLE_NAME = "movie_data_table"
const val WATCHLIST_TABLE_NAME = "watch_list_news_table"
const val FAVOURITES_TABLE_NAME="favorites_table"

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import android.content.Intent
import android.net.ConnectivityManager
import android.provider.Settings
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.example.movieflix.domain.model.Genre
import java.text.SimpleDateFormat
import java.util.Date
Expand Down Expand Up @@ -114,4 +115,10 @@ fun shareMovie(context:Context,title:String,trailer:String){
fun getRandomChar():String{
val alphabet = ('a'..'z')
return alphabet.random().toString()
}

val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("CREATE TABLE IF NOT EXISTS `${Constants.FAVOURITES_TABLE_NAME}` (`id` INTEGER NOT NULL, `movieResult` TEXT NOT NULL, PRIMARY KEY(`id`))")
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.movieflix.data.local

import androidx.lifecycle.LiveData
import com.example.movieflix.data.local.entity.FavouritesEntity
import com.example.movieflix.data.local.entity.HomeFeedEntity
import com.example.movieflix.data.local.entity.WatchListEntity
import com.example.movieflix.domain.model.MovieResult
Expand Down Expand Up @@ -29,4 +30,16 @@ suspend fun insertHomeFeedData(homeFeedEntity: HomeFeedEntity){
return movieDao.getAllWatchListData()
}

suspend fun insertFavMovie(favouritesEntity: FavouritesEntity){
movieDao.insertFavMovie(favouritesEntity)
}

suspend fun deleteFavMovie(favouritesEntity: FavouritesEntity){
movieDao.deleteFavMovie(favouritesEntity)
}

fun getAllFavMovie():LiveData<List<FavouritesEntity>>{
return movieDao.getAllFavMovies()
}

}
11 changes: 11 additions & 0 deletions app/src/main/java/com/example/movieflix/data/local/MovieDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.example.movieflix.data.local.entity.FavouritesEntity
import com.example.movieflix.data.local.entity.HomeFeedEntity
import com.example.movieflix.data.local.entity.WatchListEntity
import com.example.movieflix.domain.model.MovieResult
Expand All @@ -25,4 +26,14 @@ interface MovieDao {
@Query(" SELECT * FROM watch_list_news_table ORDER BY id DESC ")
fun getAllWatchListData():LiveData<List<WatchListEntity>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertFavMovie(favouritesEntity: FavouritesEntity)

@Delete
suspend fun deleteFavMovie(favouritesEntity: FavouritesEntity)

@Query( " SELECT * FROM favorites_table ORDER BY id DESC ")
fun getAllFavMovies():LiveData<List<FavouritesEntity>>


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ package com.example.movieflix.data.local
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.example.movieflix.data.local.entity.FavouritesEntity
import com.example.movieflix.data.local.entity.HomeFeedEntity
import com.example.movieflix.data.local.entity.WatchListEntity

@Database(entities = [HomeFeedEntity::class,WatchListEntity::class], version = 2)
@Database(entities = [HomeFeedEntity::class,WatchListEntity::class,FavouritesEntity::class], version = 3)
@TypeConverters(MovieDataTypeConverter::class)
abstract class MovieDatabase:RoomDatabase(){
abstract val dao:MovieDao
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.movieflix.data.local.entity

import androidx.room.Entity
import androidx.room.PrimaryKey
import com.example.movieflix.core.utils.Constants
import com.example.movieflix.domain.model.MovieResult

@Entity(Constants.FAVOURITES_TABLE_NAME)
data class FavouritesEntity(
@PrimaryKey val id:Int,
val movieResult: MovieResult
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.movieflix.data.repository

import androidx.lifecycle.LiveData
import com.example.movieflix.data.local.LocalDataSource
import com.example.movieflix.data.local.entity.FavouritesEntity
import com.example.movieflix.domain.repository.FavMovieRepository

class FavMovieRepositoryImpl(private val localDataSource: LocalDataSource):FavMovieRepository {
override suspend fun insertFavMovie(favouritesEntity: FavouritesEntity) {
localDataSource.insertFavMovie(favouritesEntity)
}

override suspend fun deleteFavMovie(favouritesEntity: FavouritesEntity) {
localDataSource.deleteFavMovie(favouritesEntity)
}

override fun getAllFavMovie(): LiveData<List<FavouritesEntity>> {
return localDataSource.getAllFavMovie()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.movieflix.domain.repository

import androidx.lifecycle.LiveData
import com.example.movieflix.data.local.entity.FavouritesEntity

interface FavMovieRepository {
suspend fun insertFavMovie(favouritesEntity: FavouritesEntity)

suspend fun deleteFavMovie(favouritesEntity: FavouritesEntity)

fun getAllFavMovie(): LiveData<List<FavouritesEntity>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.movieflix.domain.usecases

import androidx.lifecycle.LiveData
import com.example.movieflix.data.local.entity.FavouritesEntity
import com.example.movieflix.domain.repository.FavMovieRepository
import com.example.movieflix.domain.repository.WatchListRepository
import javax.inject.Inject

class FavMovie @Inject constructor(private val favMovieRepository: FavMovieRepository) {

suspend fun insertFavMovie(favouritesEntity: FavouritesEntity){
favMovieRepository.insertFavMovie(favouritesEntity)
}

suspend fun deleteFavMovie(favouritesEntity: FavouritesEntity){
favMovieRepository.deleteFavMovie(favouritesEntity)
}

fun getAllFavMovie(): LiveData<List<FavouritesEntity>>{
return favMovieRepository.getAllFavMovie()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import com.example.movieflix.core.utils.showToast
import com.example.movieflix.databinding.FragmentMovieDetailsBinding
import com.example.movieflix.domain.model.MovieResult
import com.example.movieflix.domain.model.MovieVideoResult
import com.example.movieflix.presentation.viewmodels.FavMovieViewModel
import com.example.movieflix.presentation.viewmodels.HomeInfoViewModel
import com.example.movieflix.presentation.viewmodels.WatchListViewModel
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
Expand All @@ -54,8 +55,11 @@ class MovieDetailsFragment : BottomSheetDialogFragment(){
CustomTabsIntent.Builder().setShowTitle(true).build()
}
private val watchListViewModel:WatchListViewModel by viewModels()
private val favMovieViewModel: FavMovieViewModel by viewModels()

private var isInWatchList:Boolean = false
private var isFav:Boolean=false


override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
setStyle(STYLE_NO_FRAME, R.style.SheetDialog)
Expand Down Expand Up @@ -101,6 +105,24 @@ class MovieDetailsFragment : BottomSheetDialogFragment(){
isInWatchList=!isInWatchList
}

fragmentMovieDetailsFavBtn.setOnClickListener(){

if (!isFav){
favMovieViewModel.insertFavMovieData(movieResult)
favIcon.setImageDrawable(ContextCompat.getDrawable(requireContext(),R.drawable.fav_red))
showToast(requireContext(),"Movie added to Favourites")
}else{

favMovieViewModel.deleteWatchListData(movieResult)
favIcon.setImageDrawable(ContextCompat.getDrawable(requireContext(),R.drawable.fav_outline))
showToast(requireContext(),"Movie removed from Favourites")
}

isFav=!isFav

}


fragmentMovieDetailsShareBtn.setOnClickListener(){
shareMovie(requireContext(),movieResult.title.toString(),youtubeUrl)
}
Expand Down Expand Up @@ -201,6 +223,22 @@ class MovieDetailsFragment : BottomSheetDialogFragment(){
}

}

favMovieViewModel.getAllMovieData().observe(viewLifecycleOwner){

if(it.isNotEmpty()){
var isFav:Boolean
for (res in it){
isFav = (res.id==mediaId)

if(isFav){
changeFavIcon()
break
}
}
}

}
}

private fun changeAddToWatchListIcon() {
Expand All @@ -210,6 +248,13 @@ class MovieDetailsFragment : BottomSheetDialogFragment(){
}
}

private fun changeFavIcon(){
binding.apply {
isFav=true
favIcon.setImageDrawable(ContextCompat.getDrawable(requireContext(),R.drawable.fav))
}
}

private fun initializePlayer(key: String?) {
binding.posterImage.gone()
binding.ytIcon.gone()
Expand Down
Loading

0 comments on commit c5cc345

Please sign in to comment.