diff --git a/app/src/main/java/com/woka/home/HomeActivity.kt b/app/src/main/java/com/woka/home/HomeActivity.kt index cced787..91d5213 100644 --- a/app/src/main/java/com/woka/home/HomeActivity.kt +++ b/app/src/main/java/com/woka/home/HomeActivity.kt @@ -93,7 +93,6 @@ class HomeActivity : WokaBaseActivity(), window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.WHITE - window.lightStatusBar() viewModel = ViewModelProvider(this)[HomeViewModel::class.java] progressView = ProgressView(this) @@ -145,7 +144,11 @@ class HomeActivity : WokaBaseActivity(), override fun onDestroy() { super.onDestroy() - unregisterReceiver(minuteReceiver) + try { + unregisterReceiver(minuteReceiver) + }catch (e: Exception){ + // do nothing + } } private fun setObservers(){ @@ -450,20 +453,28 @@ class HomeActivity : WokaBaseActivity(), override fun onBottomTabSelected(tab: Int) { when (tab){ HOME -> { - binding.notifications.show() - if (userPrefs?.appTheme == Theme.THEME_TWO){ - binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.color_primary)) - supportFragmentManager.beginTransaction() .replace(R.id.fc_home, Home2Fragment.newInstance()) + .runOnCommit { + binding.notifications.show() + window.lightStatusBar() + + binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.color_primary)) + + } .commit() }else{ - binding.root.backgroundTintList = null - supportFragmentManager.beginTransaction() .replace(R.id.fc_home, Home1Fragment.newInstance()) + .runOnCommit { + binding.notifications.show() + window.lightStatusBar() + + binding.root.backgroundTintList = null + } .commit() + } registerReceiver(minuteReceiver, IntentFilter(Intent.ACTION_TIME_TICK)) @@ -478,14 +489,17 @@ class HomeActivity : WokaBaseActivity(), , ActivityOptions.makeSceneTransitionAnimation(this).toBundle()) } MY_LIST -> { - binding.notifications.hide() - binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.orders_bg)) + unregisterReceiver(minuteReceiver) supportFragmentManager.beginTransaction() .replace(R.id.fc_home, MyListFragment.newInstance()) + .runOnCommit { + window.lightStatusBar(true) + binding.notifications.hide() + binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.orders_bg)) + } .commit() - updateBackground() viewModel.selectedBottomTab = tab } } diff --git a/app/src/main/java/com/woka/home/fragments/MyListFragment.kt b/app/src/main/java/com/woka/home/fragments/MyListFragment.kt index b57437d..7a38130 100644 --- a/app/src/main/java/com/woka/home/fragments/MyListFragment.kt +++ b/app/src/main/java/com/woka/home/fragments/MyListFragment.kt @@ -5,12 +5,19 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.SimpleItemAnimator import com.woka.databinding.FragmentMyListBinding import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.adapters.AudioBooksAdapter +import com.woka.home.mylist.adapters.GamesAdapter +import com.woka.home.mylist.adapters.KaraokeAdapter import com.woka.home.mylist.adapters.WebSeriesAdapter +import com.woka.home.mylist.models.ShowData import com.woka.networking.ApiResult import com.woka.utils.hide import com.woka.utils.show +import kotlinx.coroutines.launch class MyListFragment : Fragment() { @@ -18,6 +25,9 @@ class MyListFragment : Fragment() { private lateinit var webSeriesEAdapter: WebSeriesAdapter private lateinit var webSeriesHAdapter: WebSeriesAdapter + private lateinit var audioBooksAdapter: AudioBooksAdapter + private lateinit var karaokeAdapter: KaraokeAdapter + private lateinit var gamesAdapter: GamesAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -26,8 +36,11 @@ class MyListFragment : Fragment() { binding = FragmentMyListBinding.inflate(inflater, container, false) // adapters - webSeriesEAdapter = WebSeriesAdapter() - webSeriesHAdapter = WebSeriesAdapter() + webSeriesEAdapter = WebSeriesAdapter("1") + webSeriesHAdapter = WebSeriesAdapter("18") + audioBooksAdapter = AudioBooksAdapter() + karaokeAdapter = KaraokeAdapter() + gamesAdapter = GamesAdapter() initViews() @@ -35,15 +48,17 @@ class MyListFragment : Fragment() { setObservers() - MyListRepository.loadMyFavList() - return binding.root } private fun initViews() { binding.apply { + (rvWebSeriesEnglish.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false rvWebSeriesEnglish.adapter = webSeriesEAdapter rvWebSeriesHindi.adapter = webSeriesHAdapter + rvAudioBooks.adapter = audioBooksAdapter + rvKaraoke.adapter = karaokeAdapter + rvGames.adapter = gamesAdapter } } @@ -58,18 +73,101 @@ class MyListFragment : Fragment() { private fun setObservers(){ binding.apply { MyListRepository.myFavListLiveData.observe(viewLifecycleOwner){ - when (it){ - is ApiResult.Error -> { - webSeriesEnglishView.hide() - webSeriesHindiView.hide() - } - is ApiResult.Loading -> {} - is ApiResult.Success -> { - it.data?.result?.let { result -> - result.show_data?.let {showData -> - if (showData.isNotEmpty()){ - webSeriesEnglishView.show() - webSeriesEAdapter.submitList(ArrayList(showData)) + lifecycleScope.launch { + when (it){ + is ApiResult.Error -> { + progressBar.hide() + noData.show() + } + is ApiResult.Loading -> {} + is ApiResult.Success -> { + it.data?.result?.let { result -> + + var dataLoaded = false + + progressBar.hide() + + result.show_data?.let {showData -> + if (showData.isNotEmpty()){ + val engList = mutableListOf() + val hinList = mutableListOf() + + for (show in showData){ + val ids = show.bookmark_category_ids?.split(",") + ids?.let {bIds -> + if (bIds.isNotEmpty()) { + when (bIds.size) { + 1 -> if (bIds[0] == "1") engList.add(show) else hinList.add(show) + else -> { + engList.add(show) + hinList.add(show) + } + } + } + } + } + + if (engList.isNotEmpty()){ + webSeriesEnglishView.show() + dataLoaded = true + webSeriesEAdapter.submitList(engList) + }else{ + webSeriesEnglishView.hide() + } + + if (hinList.isNotEmpty()){ + webSeriesHindiView.show() + dataLoaded = true + webSeriesHAdapter.submitList(hinList) + }else{ + webSeriesHindiView.hide() + } + + }else{ + webSeriesEnglishView.hide() + webSeriesHindiView.hide() + } + } + + result.audio_data?.let { audioData -> + + if (audioData.isNotEmpty()){ + audioBooksView.show() + + dataLoaded = true + audioBooksAdapter.submitList(audioData) + }else{ + audioBooksView.hide() + } + + } + + result.sing_karaoke_data?.let { singKaraokeData -> + if (singKaraokeData.isNotEmpty()){ + karaokeView.show() + + dataLoaded = true + karaokeAdapter.submitList(singKaraokeData) + }else{ + karaokeView.hide() + } + } + + result.game_data?.let { gamesData -> + if (gamesData.isNotEmpty()){ + gamesView.show() + + dataLoaded = true + gamesAdapter.submitList(gamesData) + }else{ + gamesView.hide() + } + } + + if (!dataLoaded){ + noData.show() + }else{ + noData.hide() } } } diff --git a/app/src/main/java/com/woka/home/mylist/MyFavApiService.kt b/app/src/main/java/com/woka/home/mylist/MyFavApiService.kt new file mode 100644 index 0000000..92dd5a0 --- /dev/null +++ b/app/src/main/java/com/woka/home/mylist/MyFavApiService.kt @@ -0,0 +1,22 @@ +package com.woka.home.mylist + +import com.woka.networking.ApiResponse +import okhttp3.FormBody +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.POST + +interface MyFavApiService { + + @POST("post_like") + suspend fun likePost(@Body body: FormBody): Response> + + @POST("post_unlike") + suspend fun unLikePost(@Body body: FormBody): Response> + + @POST("favourite_add") + suspend fun addToFav(@Body body: FormBody): Response> + + @POST("favourite_remove") + suspend fun removeFromFav(@Body body: FormBody): Response> +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/MyListRepository.kt b/app/src/main/java/com/woka/home/mylist/MyListRepository.kt index 18e45a0..41c6055 100644 --- a/app/src/main/java/com/woka/home/mylist/MyListRepository.kt +++ b/app/src/main/java/com/woka/home/mylist/MyListRepository.kt @@ -2,23 +2,301 @@ package com.woka.home.mylist import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import com.woka.home.mylist.models.AudioData +import com.woka.home.mylist.models.GameData import com.woka.home.mylist.models.MyListResponse +import com.woka.home.mylist.models.PostType +import com.woka.home.mylist.models.ShowData +import com.woka.home.mylist.models.SingKaraokeData import com.woka.networking.ApiResult +import com.woka.networking.RetrofitHelper import com.woka.userdata.UserRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import okhttp3.FormBody +import kotlin.math.max object MyListRepository { + private val myFavApiService = RetrofitHelper.getRetrofit().create(MyFavApiService::class.java) + private val _myFavListLiveData = MutableLiveData>() val myFavListLiveData: LiveData> - get() = _myFavListLiveData + get() { + // also updating local changes + myFavData?.let { _myFavListLiveData.postValue(ApiResult.Success(it)) } + return _myFavListLiveData + } - fun loadMyFavList(){ + private var myFavData: MyListResponse? = null + + init { + loadMyFavList() + } + + private fun loadMyFavList(){ CoroutineScope(Dispatchers.IO).launch { _myFavListLiveData.postValue(ApiResult.Loading()) - _myFavListLiveData.postValue(UserRepository.loadMyFavList()) + val response = UserRepository.loadMyFavList() + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + myFavData = response.data + } + } + + _myFavListLiveData.postValue(response) + } + } + + fun likePost(postId: String, postType: PostType, categoryId: String = "0"){ + CoroutineScope(Dispatchers.IO).launch { + val response = RetrofitHelper.handleApiCall { + myFavApiService.likePost( + FormBody.Builder() + .add("post_id", postId) + .add("post_type", postType.value) + .build() + ) + } + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + changeLikeLocally(postId, postType, true) + } + } + } + } + + fun unLikePost(postId: String, postType: PostType, categoryId: String = "0") { + CoroutineScope(Dispatchers.IO).launch { + val response = RetrofitHelper.handleApiCall { + myFavApiService.unLikePost( + FormBody.Builder() + .add("post_id", postId) + .add("post_type", postType.value) + .add("category", categoryId) + .build() + ) + } + + when (response) { + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + changeLikeLocally(postId, postType, false) + } + } + } + } + + fun markAsFavShowLocally(showData: ShowData, addToFav: Boolean){ + + CoroutineScope(Dispatchers.IO).launch { + val response = RetrofitHelper.handleApiCall { + if (addToFav){ + myFavApiService.addToFav( + FormBody.Builder() + .add("post_id", "${showData.id}") + .add("post_type", PostType.WEB_SERIES.value) + .build() + ) + }else{ + myFavApiService.removeFromFav( + FormBody.Builder() + .add("post_id", "${showData.id}") + .add("post_type", PostType.WEB_SERIES.value) + .build() + ) + } + } + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + myFavData?.result?.show_data?.let { + if (addToFav){ + it.add(showData) + }else{ + it.remove(showData) + } + } + } + } + } + } + + fun markAsFavAudioLocally(audioData: AudioData, addToFav: Boolean){ + CoroutineScope(Dispatchers.IO).launch { + val response = RetrofitHelper.handleApiCall { + if (addToFav){ + myFavApiService.addToFav( + FormBody.Builder() + .add("post_id", "${audioData.id}") + .add("post_type", PostType.AUDIO_BOOKS.value) + .build() + ) + }else{ + myFavApiService.removeFromFav( + FormBody.Builder() + .add("post_id", "${audioData.id}") + .add("post_type", PostType.AUDIO_BOOKS.value) + .build() + ) + } + } + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + myFavData?.result?.audio_data?.let { + if (addToFav){ + it.add(audioData) + }else{ + it.remove(audioData) + } + } + } + } + } + } + + fun markAsFavKaraokeLocally(karaokeData: SingKaraokeData, addToFav: Boolean){ + CoroutineScope(Dispatchers.IO).launch { + val response = RetrofitHelper.handleApiCall { + if (addToFav){ + myFavApiService.addToFav( + FormBody.Builder() + .add("post_id", "${karaokeData.id}") + .add("post_type", PostType.KARAOKE.value) + .build() + ) + }else{ + myFavApiService.removeFromFav( + FormBody.Builder() + .add("post_id", "${karaokeData.id}") + .add("post_type", PostType.KARAOKE.value) + .build() + ) + } + } + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + myFavData?.result?.sing_karaoke_data?.let { + if (addToFav){ + it.add(karaokeData) + }else{ + it.remove(karaokeData) + } + } + } + } + } + } + fun markAsFavGameLocally(gameData: GameData, addToFav: Boolean){ + CoroutineScope(Dispatchers.IO).launch { + val response = RetrofitHelper.handleApiCall { + if (addToFav){ + myFavApiService.addToFav( + FormBody.Builder() + .add("post_id", "${gameData.id}") + .add("post_type", PostType.GAMES.value) + .build() + ) + }else{ + myFavApiService.removeFromFav( + FormBody.Builder() + .add("post_id", "${gameData.id}") + .add("post_type", PostType.GAMES.value) + .build() + ) + } + } + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + myFavData?.result?.game_data?.let { + if (addToFav){ + it.add(gameData) + }else{ + it.remove(gameData) + } + } + } + } + } + } + private fun changeLikeLocally(id: String, postType: PostType, isLiked: Boolean){ + when(postType){ + PostType.WEB_SERIES -> { + myFavData?.result?.show_data?.let { + for (show in it){ + if ("${show.id}" == id){ + show.is_liked = isLiked + show.likes_count?.let { count -> + show.likes_count = if (isLiked) count + 1 + else max(0, count - 1) + } + break + } + } + } + } + + PostType.AUDIO_BOOKS -> { + myFavData?.result?.audio_data?.let { + for (audio in it){ + if ("${audio.id}" == id){ + audio.is_liked = isLiked + audio.likes_count?.let { count -> + audio.likes_count = if (isLiked) count + 1 + else max(0, count - 1) + } + break + } + } + } + } + PostType.KARAOKE -> { + myFavData?.result?.sing_karaoke_data?.let { + for (song in it){ + if ("${song.id}" == id){ + song.is_liked = isLiked + song.likes_count?.let { count -> + song.likes_count = if (isLiked) count + 1 + else max(0, count - 1) + } + break + } + } + } + } + PostType.GAMES -> { + myFavData?.result?.game_data?.let { + for (game in it){ + if ("${game.id}" == id){ + game.is_liked = isLiked + game.likes_count?.let { count -> + game.likes_count = if (isLiked) count + 1 + else max(0, count - 1) + } + break + } + } + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/adapters/AudioBooksAdapter.kt b/app/src/main/java/com/woka/home/mylist/adapters/AudioBooksAdapter.kt new file mode 100644 index 0000000..eaa4bb7 --- /dev/null +++ b/app/src/main/java/com/woka/home/mylist/adapters/AudioBooksAdapter.kt @@ -0,0 +1,93 @@ +package com.woka.home.mylist.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.AsyncDifferConfig +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import com.bumptech.glide.Glide +import com.woka.databinding.FavViewHolderBinding +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.AudioData +import com.woka.home.mylist.models.PostType +import java.util.concurrent.Executors +import kotlin.math.max + +class AudioBooksAdapter(config: AsyncDifferConfig): ListAdapter(config) { + + companion object{ + private val DIFF_UTIL = object : DiffUtil.ItemCallback(){ + override fun areItemsTheSame(oldItem: AudioData, newItem: AudioData): Boolean = oldItem.id == newItem.id + override fun areContentsTheSame(oldItem: AudioData, newItem: AudioData): Boolean { + return oldItem.title == newItem.title && + oldItem.is_liked == newItem.is_liked && + oldItem.likes_count == newItem.likes_count + } + } + + private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL) + .setBackgroundThreadExecutor(Executors.newSingleThreadExecutor()) + .build() + } + + constructor(): this(DIFF_CONFIG) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder { + return FavoriteViewHolder( + FavViewHolderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: FavoriteViewHolder, position: Int) { + val audioData = getItem(position) + + holder.binding.apply { + audioData.thumbnail_path?.let { + Glide.with(root.context) + .load(it) + .into(image) + } + + title.text = audioData.title + + audioData.likes_count?.let { + likeCount.text = "$it" + } + + audioData.is_liked?.let { + like.isSelected = it + } + + like.setOnClickListener { + if (like.isSelected){ + MyListRepository.unLikePost( + "${audioData.id}", + PostType.AUDIO_BOOKS + ) + + audioData.likes_count?.let { + likeCount.text = "${max(it - 1, 0)}" + } + }else{ + MyListRepository.likePost( + "${audioData.id}", + PostType.AUDIO_BOOKS + ) + + audioData.likes_count?.let { + val value = it + 1 + likeCount.text = "$value" + } + } + + like.isSelected = !like.isSelected + } + + fav.isSelected = true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/adapters/GamesAdapter.kt b/app/src/main/java/com/woka/home/mylist/adapters/GamesAdapter.kt new file mode 100644 index 0000000..a281638 --- /dev/null +++ b/app/src/main/java/com/woka/home/mylist/adapters/GamesAdapter.kt @@ -0,0 +1,93 @@ +package com.woka.home.mylist.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.AsyncDifferConfig +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import com.bumptech.glide.Glide +import com.woka.databinding.FavViewHolderBinding +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.GameData +import com.woka.home.mylist.models.PostType +import java.util.concurrent.Executors +import kotlin.math.max + +class GamesAdapter(config: AsyncDifferConfig): ListAdapter(config) { + + companion object{ + private val DIFF_UTIL = object : DiffUtil.ItemCallback(){ + override fun areItemsTheSame(oldItem: GameData, newItem: GameData): Boolean = oldItem.id == newItem.id + override fun areContentsTheSame(oldItem: GameData, newItem: GameData): Boolean { + return oldItem.title == newItem.title && + oldItem.is_liked == newItem.is_liked && + oldItem.likes_count == newItem.likes_count + } + } + + private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL) + .setBackgroundThreadExecutor(Executors.newSingleThreadExecutor()) + .build() + } + + constructor(): this(DIFF_CONFIG) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder { + return FavoriteViewHolder( + FavViewHolderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: FavoriteViewHolder, position: Int) { + val gameData = getItem(position) + + holder.binding.apply { + gameData.thumbnail_path?.let { + Glide.with(root.context) + .load(it) + .into(image) + } + + title.text = gameData.title + + gameData.likes_count?.let { + likeCount.text = "$it" + } + + gameData.is_liked?.let { + like.isSelected = it + } + + like.setOnClickListener { + if (like.isSelected){ + MyListRepository.unLikePost( + "${gameData.id}", + PostType.GAMES + ) + + gameData.likes_count?.let { + likeCount.text = "${max(it - 1, 0)}" + } + }else{ + MyListRepository.likePost( + "${gameData.id}", + PostType.GAMES + ) + + gameData.likes_count?.let { + val value = it + 1 + likeCount.text = "$value" + } + } + + like.isSelected = !like.isSelected + } + + fav.isSelected = true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/adapters/KaraokeAdapter.kt b/app/src/main/java/com/woka/home/mylist/adapters/KaraokeAdapter.kt new file mode 100644 index 0000000..4fce0a6 --- /dev/null +++ b/app/src/main/java/com/woka/home/mylist/adapters/KaraokeAdapter.kt @@ -0,0 +1,93 @@ +package com.woka.home.mylist.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.AsyncDifferConfig +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import com.bumptech.glide.Glide +import com.woka.databinding.FavViewHolderBinding +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.PostType +import com.woka.home.mylist.models.SingKaraokeData +import java.util.concurrent.Executors +import kotlin.math.max + +class KaraokeAdapter(config: AsyncDifferConfig): ListAdapter(config) { + + companion object{ + private val DIFF_UTIL = object : DiffUtil.ItemCallback(){ + override fun areItemsTheSame(oldItem: SingKaraokeData, newItem: SingKaraokeData): Boolean = oldItem.id == newItem.id + override fun areContentsTheSame(oldItem: SingKaraokeData, newItem: SingKaraokeData): Boolean { + return oldItem.title == newItem.title && + oldItem.is_liked == newItem.is_liked && + oldItem.likes_count == newItem.likes_count + } + } + + private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL) + .setBackgroundThreadExecutor(Executors.newSingleThreadExecutor()) + .build() + } + + constructor(): this(DIFF_CONFIG) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder { + return FavoriteViewHolder( + FavViewHolderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: FavoriteViewHolder, position: Int) { + val karaokeData = getItem(position) + + holder.binding.apply { + karaokeData.thumbnail_path?.let { + Glide.with(root.context) + .load(it) + .into(image) + } + + title.text = karaokeData.title + + karaokeData.likes_count?.let { + likeCount.text = "$it" + } + + karaokeData.is_liked?.let { + like.isSelected = it + } + + like.setOnClickListener { + if (like.isSelected){ + MyListRepository.unLikePost( + "${karaokeData.id}", + PostType.KARAOKE + ) + + karaokeData.likes_count?.let { + likeCount.text = "${max(it - 1, 0)}" + } + }else{ + MyListRepository.likePost( + "${karaokeData.id}", + PostType.KARAOKE + ) + + karaokeData.likes_count?.let { + val value = it + 1 + likeCount.text = "$value" + } + } + + like.isSelected = !like.isSelected + } + + fav.isSelected = true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/adapters/WebSeriesAdapter.kt b/app/src/main/java/com/woka/home/mylist/adapters/WebSeriesAdapter.kt index 9f33e85..96f8639 100644 --- a/app/src/main/java/com/woka/home/mylist/adapters/WebSeriesAdapter.kt +++ b/app/src/main/java/com/woka/home/mylist/adapters/WebSeriesAdapter.kt @@ -7,15 +7,22 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.bumptech.glide.Glide import com.woka.databinding.FavViewHolderBinding +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.PostType import com.woka.home.mylist.models.ShowData import java.util.concurrent.Executors +import kotlin.math.max -class WebSeriesAdapter(config: AsyncDifferConfig): ListAdapter(config) { +class WebSeriesAdapter(private val categoryId: String, config: AsyncDifferConfig): ListAdapter(config) { companion object{ private val DIFF_UTIL = object : DiffUtil.ItemCallback(){ override fun areItemsTheSame(oldItem: ShowData, newItem: ShowData): Boolean = oldItem.id == newItem.id - override fun areContentsTheSame(oldItem: ShowData, newItem: ShowData): Boolean = oldItem == newItem + override fun areContentsTheSame(oldItem: ShowData, newItem: ShowData): Boolean { + return oldItem.title == newItem.title && + oldItem.is_liked == newItem.is_liked && + oldItem.likes_count == newItem.likes_count + } } private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL) @@ -23,7 +30,7 @@ class WebSeriesAdapter(config: AsyncDifferConfig): ListAdapter): ListAdapter?, - val game_data: List?, - val show_data: List?, - val sing_karaoke_data: List?, - val video_data: List? + val audio_data: MutableList?, + val game_data: MutableList?, + val show_data: MutableList?, + val sing_karaoke_data: MutableList?, + val video_data: MutableList? ) \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/models/ShowData.kt b/app/src/main/java/com/woka/home/mylist/models/ShowData.kt index 7b3bf72..75896c4 100644 --- a/app/src/main/java/com/woka/home/mylist/models/ShowData.kt +++ b/app/src/main/java/com/woka/home/mylist/models/ShowData.kt @@ -9,9 +9,9 @@ data class ShowData( val description: String?, val gender_master_id: String?, val id: Int?, - val is_liked: Boolean?, - val likes_count: Int?, - val mark_as_favourite: Boolean?, + var is_liked: Boolean?, + var likes_count: Int?, + var mark_as_favourite: Boolean?, val show_type: String?, val thumbnail_path: String?, val title: String?, diff --git a/app/src/main/java/com/woka/home/mylist/models/SingKaraokeData.kt b/app/src/main/java/com/woka/home/mylist/models/SingKaraokeData.kt index 93d6822..bdc52c0 100644 --- a/app/src/main/java/com/woka/home/mylist/models/SingKaraokeData.kt +++ b/app/src/main/java/com/woka/home/mylist/models/SingKaraokeData.kt @@ -10,9 +10,9 @@ data class SingKaraokeData( val duration: String?, val gender_master_id: String?, val id: Int?, - val is_liked: Boolean?, + var is_liked: Boolean?, val language_master_id: Int?, - val likes_count: Int?, + var likes_count: Int?, val mark_as_favourite: Boolean?, val release_date: String?, val thumbnail_path: String?, diff --git a/app/src/main/res/drawable/ic_like_filled.xml b/app/src/main/res/drawable/ic_like_filled.xml new file mode 100644 index 0000000..c2d496e --- /dev/null +++ b/app/src/main/res/drawable/ic_like_filled.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_like_not_filled.xml b/app/src/main/res/drawable/ic_like_not_filled.xml new file mode 100644 index 0000000..64066ec --- /dev/null +++ b/app/src/main/res/drawable/ic_like_not_filled.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_like_selector.xml b/app/src/main/res/drawable/ic_like_selector.xml new file mode 100644 index 0000000..c5a068e --- /dev/null +++ b/app/src/main/res/drawable/ic_like_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fav_view_holder.xml b/app/src/main/res/layout/fav_view_holder.xml index aec140c..f369055 100644 --- a/app/src/main/res/layout/fav_view_holder.xml +++ b/app/src/main/res/layout/fav_view_holder.xml @@ -20,7 +20,7 @@ - + + + + @@ -70,7 +71,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/back_btn" - android:layout_marginTop="25dp" + android:layout_marginTop="15dp" android:orientation="vertical"> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 68ee883..2c22b77 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -171,4 +171,6 @@ Favorites WEB SERIES (HINDI) WEB SERIES (ENGLISH) + No favorites added + 0 \ No newline at end of file