MyList all of the recycler views integrated and shown

offline data handling for my fav data in repository

like count and click api integration

remove from favorite api integration
This commit is contained in:
2024-06-14 20:58:19 +05:30
parent 27be75d831
commit 10d8f603d6
20 changed files with 908 additions and 54 deletions

View File

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

View File

@@ -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<ShowData>()
val hinList = mutableListOf<ShowData>()
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()
}
}
}

View File

@@ -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<ApiResponse<Any>>
@POST("post_unlike")
suspend fun unLikePost(@Body body: FormBody): Response<ApiResponse<Any>>
@POST("favourite_add")
suspend fun addToFav(@Body body: FormBody): Response<ApiResponse<Any>>
@POST("favourite_remove")
suspend fun removeFromFav(@Body body: FormBody): Response<ApiResponse<Any>>
}

View File

@@ -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<ApiResult<MyListResponse>>()
val myFavListLiveData: LiveData<ApiResult<MyListResponse>>
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
}
}
}
}
}
}
}

View File

@@ -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<AudioData>): ListAdapter<AudioData, FavoriteViewHolder>(config) {
companion object{
private val DIFF_UTIL = object : DiffUtil.ItemCallback<AudioData>(){
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
}
}
}

View File

@@ -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<GameData>): ListAdapter<GameData, FavoriteViewHolder>(config) {
companion object{
private val DIFF_UTIL = object : DiffUtil.ItemCallback<GameData>(){
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
}
}
}

View File

@@ -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<SingKaraokeData>): ListAdapter<SingKaraokeData, FavoriteViewHolder>(config) {
companion object{
private val DIFF_UTIL = object : DiffUtil.ItemCallback<SingKaraokeData>(){
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
}
}
}

View File

@@ -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<ShowData>): ListAdapter<ShowData, FavoriteViewHolder>(config) {
class WebSeriesAdapter(private val categoryId: String, config: AsyncDifferConfig<ShowData>): ListAdapter<ShowData, FavoriteViewHolder>(config) {
companion object{
private val DIFF_UTIL = object : DiffUtil.ItemCallback<ShowData>(){
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<ShowData>): ListAdapter<ShowDat
.build()
}
constructor(): this(DIFF_CONFIG)
constructor(categoryId: String): this(categoryId, DIFF_CONFIG)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder {
return FavoriteViewHolder(
@@ -47,7 +54,54 @@ class WebSeriesAdapter(config: AsyncDifferConfig<ShowData>): ListAdapter<ShowDat
title.text = showData.title
showData.likes_count?.let {
likeCount.text = "$it"
}
showData.is_liked?.let {
like.isSelected = it
}
like.setOnClickListener {
if (like.isSelected){
MyListRepository.unLikePost(
"${showData.id}",
PostType.WEB_SERIES,
categoryId
)
showData.likes_count?.let {
likeCount.text = "${max(it - 1, 0)}"
}
}else{
MyListRepository.likePost(
"${showData.id}",
PostType.WEB_SERIES,
categoryId
)
showData.likes_count?.let {
val value = it + 1
likeCount.text = "$value"
}
}
like.isSelected = !like.isSelected
}
fav.isSelected = true
fav.setOnClickListener {
if (fav.isSelected){
MyListRepository.markAsFavShowLocally(
showData,
false
)
currentList.removeAt(position)
notifyItemRemoved(position)
}
}
}
}
}

View File

@@ -11,9 +11,9 @@ data class AudioData(
val description: 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 media_id: String?,
val release_date: String?,

View File

@@ -10,9 +10,9 @@ data class GameData(
val game_url: 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 screen_orientation: String?,

View File

@@ -0,0 +1,8 @@
package com.woka.home.mylist.models
enum class PostType(val value: String) {
WEB_SERIES("1"),
AUDIO_BOOKS("7"),
KARAOKE("8"),
GAMES("6");
}

View File

@@ -1,9 +1,9 @@
package com.woka.home.mylist.models
data class Result(
val audio_data: List<AudioData>?,
val game_data: List<GameData>?,
val show_data: List<ShowData>?,
val sing_karaoke_data: List<SingKaraokeData>?,
val video_data: List<Any>?
val audio_data: MutableList<AudioData>?,
val game_data: MutableList<GameData>?,
val show_data: MutableList<ShowData>?,
val sing_karaoke_data: MutableList<SingKaraokeData>?,
val video_data: MutableList<Any>?
)

View File

@@ -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?,

View File

@@ -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?,

View File

@@ -0,0 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="#1C274C" android:pathData="M20.27,16.265L20.975,12.185C21.152,11.166 20.368,10.234 19.335,10.234H14.154C13.64,10.234 13.249,9.773 13.333,9.266L13.995,5.221C14.103,4.564 14.072,3.892 13.905,3.248C13.766,2.714 13.354,2.285 12.813,2.111L12.668,2.064C12.34,1.959 11.983,1.984 11.674,2.132C11.335,2.296 11.086,2.595 10.994,2.95L10.518,4.784C10.367,5.367 10.146,5.93 9.862,6.463C9.447,7.24 8.805,7.862 8.137,8.438L6.698,9.677C6.293,10.027 6.08,10.551 6.126,11.084L6.938,20.477C7.012,21.339 7.733,22 8.597,22H13.245C16.726,22 19.698,19.574 20.27,16.265Z"/>
<path android:fillColor="#1C274C" android:fillType="evenOdd" android:pathData="M2.968,9.485C3.369,9.468 3.713,9.77 3.747,10.17L4.719,21.406C4.781,22.128 4.213,22.75 3.487,22.75C2.803,22.75 2.25,22.195 2.25,21.513V10.234C2.25,9.833 2.566,9.502 2.968,9.485Z"/>
</vector>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="800dp"
android:height="800dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12.438,2.778C12.293,2.732 12.134,2.743 12,2.808C11.852,2.879 11.755,3.003 11.72,3.138L11.244,4.972C11.078,5.613 10.835,6.232 10.524,6.816C10.039,7.723 9.306,8.42 8.626,9.006L7.188,10.246C6.965,10.438 6.847,10.726 6.873,11.02L7.685,20.413C7.726,20.887 8.122,21.25 8.596,21.25H13.245C16.381,21.25 19.024,19.068 19.531,16.137L20.236,12.057C20.333,11.496 19.901,10.984 19.335,10.984H14.154C13.177,10.984 12.434,10.108 12.592,9.145L13.255,5.1C13.346,4.546 13.32,3.979 13.179,3.436C13.107,3.16 12.89,2.923 12.583,2.825L12.438,2.778L12.668,2.064L12.438,2.778ZM11.349,1.457C11.831,1.224 12.387,1.187 12.897,1.35L13.042,1.397L12.813,2.111L13.042,1.397C13.819,1.646 14.425,2.267 14.631,3.059C14.824,3.805 14.86,4.583 14.735,5.343L14.072,9.387C14.064,9.439 14.104,9.484 14.154,9.484H19.335C20.834,9.484 21.969,10.837 21.714,12.313L21.009,16.393C20.371,20.081 17.071,22.75 13.245,22.75H8.596C7.343,22.75 6.299,21.79 6.191,20.542L5.378,11.149C5.311,10.375 5.62,9.616 6.209,9.109L7.647,7.87C8.302,7.305 8.854,6.758 9.2,6.109C9.457,5.629 9.656,5.121 9.792,4.595L10.268,2.762C10.417,2.186 10.817,1.713 11.349,1.457ZM2.968,9.485C3.369,9.468 3.713,9.769 3.747,10.17L4.719,21.406C4.781,22.128 4.213,22.75 3.487,22.75C2.803,22.75 2.25,22.195 2.25,21.513V10.234C2.25,9.833 2.566,9.502 2.968,9.485Z"
android:fillColor="#1C274C"
android:fillType="evenOdd"/>
</vector>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_like_filled"
android:state_selected="true"/>
<item android:drawable="@drawable/ic_like_not_filled"
android:state_selected="false"/>
</selector>

View File

@@ -20,7 +20,7 @@
<ImageView
android:id="@+id/image"
android:layout_width="@dimen/_200sdp"
android:layout_width="@dimen/_240sdp"
android:layout_height="@dimen/_120sdp"
android:contentDescription="@string/image"
android:src="@android:color/darker_gray"
@@ -39,6 +39,7 @@
tools:text="Woka title of show"
android:fontFamily="@font/exo_2_bold"
android:textColor="@color/color_primary"
android:textSize="@dimen/_14ssp"
android:maxLines="1"
android:ellipsize="end"
@@ -46,17 +47,54 @@
app:layout_constraintTop_toBottomOf="@id/image"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/fav"
app:layout_constraintEnd_toStartOf="@id/like"
android:layout_marginTop="5dp"
android:layout_marginEnd="10dp"
/>
<ImageView
<com.woka.utils.PressableImageView
android:id="@+id/like"
android:layout_width="25dp"
android:layout_height="24dp"
android:contentDescription="@string/image"
android:src="@drawable/ic_like_selector"
android:scaleType="fitXY"
app:tint="@color/color_primary"
app:layout_constraintEnd_toStartOf="@id/like_count"
app:layout_constraintTop_toBottomOf="@id/image"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="5dp"
android:layout_marginEnd="2dp"
/>
<TextView
android:id="@+id/like_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/_0"
android:fontFamily="@font/exo_2_semibold"
android:textColor="@color/color_primary"
android:textSize="@dimen/_14ssp"
android:textAlignment="center"
app:layout_constraintEnd_toStartOf="@id/fav"
app:layout_constraintTop_toBottomOf="@id/image"
app:layout_constraintBottom_toBottomOf="@id/like"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
/>
<com.woka.utils.PressableImageView
android:id="@+id/fav"
android:layout_width="18dp"
android:layout_height="16dp"
android:layout_width="20dp"
android:layout_height="19dp"
android:contentDescription="@string/image"
android:src="@drawable/ic_heart_select"
android:scaleType="fitXY"

View File

@@ -6,6 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#D3EFF8"
android:layout_marginBottom="15dp"
tools:context=".shop.MyOrdersActivity">
<ImageView
@@ -22,7 +23,7 @@
android:translationZ="1dp"
android:layout_marginStart="15dp"
android:layout_marginTop="20dp"
android:layout_marginTop="25dp"
app:tint="@color/color_primary" />
@@ -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">
<LinearLayout
@@ -246,4 +247,37 @@
</androidx.core.widget.NestedScrollView>
<TextView
android:id="@+id/no_data"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_favorites_added"
android:fontFamily="@font/exo_2_bold"
android:textColor="@color/color_primary"
android:textSize="@dimen/_14ssp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
android:indeterminateTint="@color/color_primary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -171,4 +171,6 @@
<string name="favorites">Favorites</string>
<string name="web_series_hindi">WEB SERIES (HINDI)</string>
<string name="web_series_english">WEB SERIES (ENGLISH)</string>
<string name="no_favorites_added">No favorites added</string>
<string name="_0">0</string>
</resources>