diff --git a/app/src/main/java/com/woka/audiobooks/AudioBookApiService.kt b/app/src/main/java/com/woka/audiobooks/AudioBookApiService.kt new file mode 100644 index 0000000..0d13bf7 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/AudioBookApiService.kt @@ -0,0 +1,12 @@ +package com.woka.audiobooks + +import com.woka.audiobooks.models.audiodata.AudioBooksResponse +import com.woka.networking.ApiResponse +import retrofit2.Response +import retrofit2.http.POST + +interface AudioBookApiService { + + @POST("listen_audio_listing") + suspend fun audioBookListing(): Response> +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/AudioBookRepository.kt b/app/src/main/java/com/woka/audiobooks/AudioBookRepository.kt new file mode 100644 index 0000000..e1f6074 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/AudioBookRepository.kt @@ -0,0 +1,203 @@ +package com.woka.audiobooks + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.woka.audiobooks.models.audiodata.AudioBookData +import com.woka.audiobooks.models.audiodata.AudioBooksResponse +import com.woka.audiobooks.models.continuedata.ContinueAudioResponse +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.PostType +import com.woka.networking.ApiResult +import com.woka.networking.RetrofitHelper +import com.woka.networking.RetrofitHelper.handleApiCall +import com.woka.userdata.UserActionApiService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.FormBody +import kotlin.math.max + +object AudioBookRepository { + + // api services + private val apiService = RetrofitHelper.getRetrofit().create(AudioBookApiService::class.java) + private val userActionApiService = RetrofitHelper.getRetrofit().create(UserActionApiService::class.java) + + // live data + // audio books data (loose caching) + private val _audioBooksLiveData = MutableLiveData>() + val audioBooksLiveData: LiveData> + get() = _audioBooksLiveData + + private var audioBooksData: AudioBooksResponse? = null + + // continue watch audio books data + private val _continueAudioBooksLiveData = MutableLiveData>() + val continueAudioBooksLiveData: LiveData> + get() = _continueAudioBooksLiveData + + private var continueAudioData: ContinueAudioResponse? = null + + fun loadAudioBooks(){ + if (audioBooksData != null){ + _audioBooksLiveData.postValue(ApiResult.Success(audioBooksData)) + return + } + + CoroutineScope(Dispatchers.IO).launch{ + _audioBooksLiveData.postValue(ApiResult.Loading()) + + val response = handleApiCall{ + apiService.audioBookListing() + } + + when (response){ + is ApiResult.Error -> _audioBooksLiveData.postValue(ApiResult.Error(response.errorMessage, response.error)) + is ApiResult.Loading -> _audioBooksLiveData.postValue(ApiResult.Loading()) + is ApiResult.Success -> { + response.data?.let { + audioBooksData = it + _audioBooksLiveData.postValue(ApiResult.Success(it)) + }?:{ + _audioBooksLiveData.postValue(ApiResult.Error()) + } + } + } + } + } + + fun loadContinueListening(){ + if (continueAudioData != null){ + _continueAudioBooksLiveData.postValue(ApiResult.Success(continueAudioData)) + return + } + + CoroutineScope(Dispatchers.IO).launch { + val response = handleApiCall { + userActionApiService.continueAudioBookListing( + FormBody.Builder() + .add("post_type", "7") + .build() + ) + } + + when (response){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + response.data?.let { + continueAudioData = it + } + } + } + + _continueAudioBooksLiveData.postValue(response) + } + } + + fun likeUnLikeAudioBook(postId: String, likeIt: Boolean){ + CoroutineScope(Dispatchers.IO).launch { + handleApiCall { + if (likeIt){ + userActionApiService.likePost( + FormBody.Builder() + .add("post_id", postId) + .add("post_type", PostType.AUDIO_BOOKS.value) + .build() + ) + }else{ + userActionApiService.unLikePost( + FormBody.Builder() + .add("post_id", postId) + .add("post_type", PostType.AUDIO_BOOKS.value) + .build() + ) + } + } + + changeLikeLocally(postId, likeIt) + } + } + + private fun changeLikeLocally(id: String, isLiked: Boolean){ + // changing in audio books locally + audioBooksData?.audio_data?.let {audioBooks -> + for (audio in audioBooks){ + var found = false + audio?.let {data -> + if ("${data.id}" == id){ + + data.is_liked = isLiked + + data.likes_count?.let { count -> + data.likes_count = if (isLiked) count + 1 + else max(0, count - 1) + } + + found = true + } + } + if (found) break + } + } + + // changing in fav list locally + MyListRepository.myFavData.result?.audio_data?.let { + for (audioData in it){ + if ("${audioData.id}" == id){ + audioData.is_liked = isLiked + audioData.likes_count?.let { count -> + audioData.likes_count = if (isLiked) count + 1 + else max(0, count - 1) + } + break + } + } + } + } + + fun updateFavShow(id: Int?, addToBookmark: Boolean){ + CoroutineScope(Dispatchers.IO).launch { + handleApiCall { + if (addToBookmark){ + userActionApiService.addToFav( + FormBody.Builder() + .add("post_id", "$id") + .add("post_type", PostType.WEB_SERIES.value) + .build() + ) + }else{ + userActionApiService.removeFromFav( + FormBody.Builder() + .add("id", "$id") + .add("post_type", PostType.WEB_SERIES.value) + .build() + ) + } + } + } + + MyListRepository.myFavData.result?.audio_data?.let { + for (audio in it){ + if (audio.id == id){ + audio.mark_as_favourite = addToBookmark + break + } + } + } + + audioBooksData?.audio_data?.filterNotNull()?.let { + for (audio in it){ + if (audio.id == id){ + audio.mark_as_favourite = addToBookmark + } + } + } + + } + + fun clearData(){ + audioBooksData = null + continueAudioData = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/adapters/AudioBooksAdapter.kt b/app/src/main/java/com/woka/audiobooks/adapters/AudioBooksAdapter.kt new file mode 100644 index 0000000..2e93bf4 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/adapters/AudioBooksAdapter.kt @@ -0,0 +1,115 @@ +package com.woka.audiobooks.adapters + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.woka.R +import com.woka.WokaApp.Companion.userPrefs +import com.woka.audiobooks.AudioBookRepository +import com.woka.audiobooks.models.audiodata.AudioBookData +import com.woka.databinding.ShowViewHolderBinding +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.PostType +import com.woka.utils.isNetworkConnected +import com.woka.utils.show +import com.woka.utils.toast + +class AudioBooksAdapter( + private val context: Context, + var onBookClicked: (AudioBookData, Int) -> Unit +): RecyclerView.Adapter() { + + inner class AudioBookViewHolder(val binding: ShowViewHolderBinding): ViewHolder(binding.root) + + private var audioBookList: List = ArrayList() + + @SuppressLint("NotifyDataSetChanged") + fun submitListShowList(it: List) { + this.audioBookList = it + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioBookViewHolder { + return AudioBookViewHolder( + ShowViewHolderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun getItemCount(): Int = audioBookList.size + + override fun onBindViewHolder(holder: AudioBookViewHolder, position: Int) { + val audioBook = audioBookList[holder.absoluteAdapterPosition] + + holder.binding.apply { + audioBook.thumbnail_path?.let { + image.loadImage(it) + } + + audioBook.content_more_details?.let {moreDetailsList -> + title.text = if (moreDetailsList.isNotEmpty()){ + if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ + moreDetailsList[1]?.title + }else{ + moreDetailsList[0]?.title + } + }else{ + audioBook.title + } + } + + like.show() + likeCount.show() + fav.show() + + audioBook.likes_count?.let { + likeCount.text = "$it" + } + + audioBook.is_liked?.let { + like.isSelected = it + } + + like.setOnClickListener { + if (!context.isNetworkConnected()){ + context.toast(context.getString(R.string.no_internet)) + return@setOnClickListener + } + + AudioBookRepository.likeUnLikeAudioBook( + "${audioBook.id}", + !fav.isSelected + ) + + like.isSelected = !like.isSelected + likeCount.text = "${audioBook.likes_count}" + } + + fav.isSelected = audioBook.mark_as_favourite == true + + fav.setOnClickListener { + if (!context.isNetworkConnected()){ + context.toast(context.getString(R.string.no_internet)) + return@setOnClickListener + } + + AudioBookRepository.updateFavShow( + audioBook.id, + !fav.isSelected + ) + + fav.isSelected = audioBook.mark_as_favourite == true + } + + root.setOnClickListener { + onBookClicked(audioBook, holder.absoluteAdapterPosition) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/adapters/ContinueAudioAdapter.kt b/app/src/main/java/com/woka/audiobooks/adapters/ContinueAudioAdapter.kt new file mode 100644 index 0000000..5145c6c --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/adapters/ContinueAudioAdapter.kt @@ -0,0 +1,87 @@ +package com.woka.audiobooks.adapters + +import android.content.Context +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.woka.R +import com.woka.audiobooks.models.continuedata.ContinueAudioData +import com.woka.databinding.FavViewHolderBinding +import com.woka.home.mylist.adapters.FavoriteViewHolder +import com.woka.utils.isNetworkConnected +import com.woka.utils.toast +import java.util.concurrent.Executors + +class ContinueAudioAdapter(private val context: Context, + config: AsyncDifferConfig): ListAdapter(config) { + + companion object{ + private val DIFF_UTIL = object : DiffUtil.ItemCallback(){ + override fun areItemsTheSame(oldItem: ContinueAudioData, newItem: ContinueAudioData): Boolean = oldItem.id == newItem.id + override fun areContentsTheSame(oldItem: ContinueAudioData, newItem: ContinueAudioData): Boolean { + return oldItem.title == newItem.title && + oldItem.is_liked == newItem.is_liked && + oldItem.likes_count == newItem.likes_count && + oldItem.mark_as_favourite == newItem.mark_as_favourite + } + } + + private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL) + .setBackgroundThreadExecutor(Executors.newSingleThreadExecutor()) + .build() + } + + constructor(context: Context): this(context, 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, pos: Int) { + val audioData = getItem(holder.absoluteAdapterPosition) + + holder.binding.apply { + audioData.thumbnail_path?.let { + image.loadImage(it) + } + + title.text = audioData.title + + audioData.likes_count?.let { + likeCount.text = "$it" + } + + audioData.is_liked?.let { + like.isSelected = it + } + + like.setOnClickListener { + if (!context.isNetworkConnected()){ + context.toast(context.getString(R.string.no_internet)) + return@setOnClickListener + } + + + } + + fav.isSelected = audioData.mark_as_favourite == true + + fav.setOnClickListener { + if (!context.isNetworkConnected()){ + context.toast(context.getString(R.string.no_internet)) + return@setOnClickListener + } + + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/audiodata/AudioBookData.kt b/app/src/main/java/com/woka/audiobooks/models/audiodata/AudioBookData.kt new file mode 100644 index 0000000..20ebc9d --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/audiodata/AudioBookData.kt @@ -0,0 +1,27 @@ +package com.woka.audiobooks.models.audiodata + +data class AudioBookData( + val age_range_data: List?, + val age_range_master_id: String?, + val audio_duration: String?, + val audio_url: String?, + val bookmark_count: Int?, + val category_data: List?, + val category_master_id: String?, + val content_more_details: List?, + val description: String?, + val gender_data: List?, + val gender_master_id: String?, + val id: Int?, + var is_liked: Boolean?, + val language_master_id: Int?, + var likes_count: Int?, + var mark_as_favourite: Boolean?, + val media_id: String?, + val release_date: String?, + val tags_keyword: String?, + val thumbnail_path: String?, + val title: String?, + val user_video_view: List?, + val views_count: Int? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/audiodata/AudioBooksResponse.kt b/app/src/main/java/com/woka/audiobooks/models/audiodata/AudioBooksResponse.kt new file mode 100644 index 0000000..9b38d27 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/audiodata/AudioBooksResponse.kt @@ -0,0 +1,6 @@ +package com.woka.audiobooks.models.audiodata + +data class AudioBooksResponse( + val audio_data: List?, + val total_records: Int? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/audiodata/CategoryData.kt b/app/src/main/java/com/woka/audiobooks/models/audiodata/CategoryData.kt new file mode 100644 index 0000000..051f939 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/audiodata/CategoryData.kt @@ -0,0 +1,6 @@ +package com.woka.audiobooks.models.audiodata + +data class CategoryData( + val category_name: String?, + val id: Int? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/audiodata/ContentMoreDetail.kt b/app/src/main/java/com/woka/audiobooks/models/audiodata/ContentMoreDetail.kt new file mode 100644 index 0000000..5d8d12d --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/audiodata/ContentMoreDetail.kt @@ -0,0 +1,12 @@ +package com.woka.audiobooks.models.audiodata + +data class ContentMoreDetail( + val content_id: Int?, + val description: String?, + val id: Int?, + val language_master_id: Int?, + val post_type: Int?, + val tags_keywords: String?, + val title: String?, + val url: String? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/continuedata/ContentMoreDetail.kt b/app/src/main/java/com/woka/audiobooks/models/continuedata/ContentMoreDetail.kt new file mode 100644 index 0000000..49b9188 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/continuedata/ContentMoreDetail.kt @@ -0,0 +1,12 @@ +package com.woka.audiobooks.models.continuedata + +data class ContentMoreDetail( + val content_id: Int?, + val description: String?, + val id: Int?, + val language_master_id: Int?, + val post_type: Int?, + val tags_keywords: String?, + val title: String?, + val url: String? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/continuedata/ContinueAudioData.kt b/app/src/main/java/com/woka/audiobooks/models/continuedata/ContinueAudioData.kt new file mode 100644 index 0000000..6ac6143 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/continuedata/ContinueAudioData.kt @@ -0,0 +1,25 @@ +package com.woka.audiobooks.models.continuedata + +data class ContinueAudioData( + val age_range_master_id: String?, + val audio_duration: String?, + val audio_url: String?, + val bookmark_count: Int?, + val category_master_id: String?, + val content_more_details: List?, + val description: String?, + val gender_master_id: String?, + val id: Int?, + val is_liked: Boolean?, + val language_master_id: Int?, + val likes_count: Int?, + val mark_as_favourite: Boolean?, + val media_id: String?, + val release_date: String?, + val show_data_count: Any?, + val tags_keyword: String?, + val thumbnail_path: String?, + val title: String?, + val user_video_view: List?, + val views_count: Int? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/continuedata/ContinueAudioResponse.kt b/app/src/main/java/com/woka/audiobooks/models/continuedata/ContinueAudioResponse.kt new file mode 100644 index 0000000..d4f3416 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/continuedata/ContinueAudioResponse.kt @@ -0,0 +1,6 @@ +package com.woka.audiobooks.models.continuedata + +data class ContinueAudioResponse( + val result: List?, + val total_records: Int? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/models/continuedata/UserVideoView.kt b/app/src/main/java/com/woka/audiobooks/models/continuedata/UserVideoView.kt new file mode 100644 index 0000000..3403384 --- /dev/null +++ b/app/src/main/java/com/woka/audiobooks/models/continuedata/UserVideoView.kt @@ -0,0 +1,11 @@ +package com.woka.audiobooks.models.continuedata + +data class UserVideoView( + val category_id: Int?, + val id: Int?, + val last_watched_left: String?, + val post_id: Int?, + val post_type: Int?, + val total_watched_duration: String?, + val user_id: Int? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt b/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt index 254e10d..d899a73 100644 --- a/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt +++ b/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt @@ -4,15 +4,27 @@ import android.os.Bundle import androidx.activity.enableEdgeToEdge import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.recyclerview.widget.SimpleItemAnimator import com.google.android.material.appbar.CollapsingToolbarLayout import com.woka.R +import com.woka.WokaApp +import com.woka.audiobooks.AudioBookRepository +import com.woka.audiobooks.adapters.AudioBooksAdapter +import com.woka.audiobooks.adapters.ContinueAudioAdapter +import com.woka.audiobooks.models.audiodata.AudioBookData import com.woka.databinding.ActivityAudioBooksBinding +import com.woka.networking.ApiResult import com.woka.utils.WokaBaseActivity +import com.woka.utils.hide +import com.woka.utils.show class AudioBooksActivity : WokaBaseActivity() { private lateinit var binding: ActivityAudioBooksBinding + private lateinit var audioBookAdapter: AudioBooksAdapter + private lateinit var continueAudioAdapter: ContinueAudioAdapter + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() @@ -24,7 +36,20 @@ class AudioBooksActivity : WokaBaseActivity() { insets } + window.apply { + navigationBarColor = getColor(R.color.color_primary_dark) + } + + audioBookAdapter = AudioBooksAdapter(this, ::onBookClicked) + continueAudioAdapter = ContinueAudioAdapter(this) + initViews() + + clickEvents() + + setObservers() + + AudioBookRepository.loadAudioBooks() } private fun initViews(){ @@ -32,6 +57,109 @@ class AudioBooksActivity : WokaBaseActivity() { adjustTrailerImage() toolbar.title.text = getString(R.string.audio_books) + + rvAudioBooks.adapter = audioBookAdapter + (rvAudioBooks.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false + + rvContinueListen.adapter = continueAudioAdapter + (rvContinueListen.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false + } + } + + private fun clickEvents(){ + binding.apply { + toolbar.backBtn.setOnClickListener { + onBackPressedDispatcher.onBackPressed() + } + + retryBtn.setOnClickListener { + AudioBookRepository.loadAudioBooks() + } + } + } + + private fun setObservers(){ + AudioBookRepository.audioBooksLiveData.observe(this){ + when (it){ + is ApiResult.Error -> { + binding.shimmer.hide() + binding.rvAudioBooks.hide() + binding.listenTxt.hide() + binding.trailerView.hide() + + binding.errorView.show() + } + is ApiResult.Loading -> { + binding.shimmer.show() + + binding.rvAudioBooks.hide() + binding.listenTxt.hide() + binding.trailerView.hide() + binding.errorView.hide() + } + is ApiResult.Success -> { + it.data?.audio_data?.filterNotNull()?.let {audioBookData -> + if (audioBookData.isNotEmpty()){ + binding.shimmer.hide() + binding.errorView.hide() + + AudioBookRepository.loadContinueListening() + + loadTrailerData(audioBookData[0]) + binding.rvAudioBooks.show() + binding.listenTxt.show() + + audioBookAdapter.submitListShowList(audioBookData) + } + } + } + } + } + + AudioBookRepository.continueAudioBooksLiveData.observe(this){ + when(it){ + is ApiResult.Error -> { + binding.continueListenTxt.hide() + binding.rvContinueListen.hide() + } + is ApiResult.Loading -> {} + is ApiResult.Success -> { + it.data?.result?.filterNotNull()?.let {continueData -> + if (continueData.isNotEmpty()){ + binding.continueListenTxt.show() + binding.rvContinueListen.show() + + continueAudioAdapter.submitList(continueData.toMutableList()) + }else{ + binding.continueListenTxt.hide() + binding.rvContinueListen.hide() + } + } + } + } + } + } + + private fun loadTrailerData(audioBookData: AudioBookData){ + binding.apply { + trailerView.show() + adjustTrailerImage() + + audioBookData.thumbnail_path?.let { + trailerImage.loadImage(it) + } + + audioBookData.content_more_details?.let {moreDetailsList -> + trailerName.text = if (moreDetailsList.isNotEmpty()){ + if (WokaApp.userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ + moreDetailsList[1]?.title + }else{ + moreDetailsList[0]?.title + } + }else{ + audioBookData.title + } + } } } @@ -45,4 +173,8 @@ class AudioBooksActivity : WokaBaseActivity() { } } } + + private fun onBookClicked(audioBookData: AudioBookData, position: Int){ + + } } \ No newline at end of file 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 bb593b4..6e7f271 100644 --- a/app/src/main/java/com/woka/home/fragments/MyListFragment.kt +++ b/app/src/main/java/com/woka/home/fragments/MyListFragment.kt @@ -2,7 +2,6 @@ package com.woka.home.fragments import android.content.Intent import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View @@ -16,17 +15,15 @@ import androidx.recyclerview.widget.SimpleItemAnimator import com.woka.R import com.woka.databinding.FragmentMyListBinding import com.woka.home.mylist.MyListRepository -import com.woka.home.mylist.adapters.AudioBooksAdapter +import com.woka.home.mylist.adapters.FavAudioAdapter 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.PostType import com.woka.home.mylist.models.BookmarkedShowData import com.woka.networking.ApiResult -import com.woka.utils.TAG import com.woka.utils.hide import com.woka.utils.show -import com.woka.webseries.models.ShowData import com.woka.webseries.views.SeasonActivity import kotlinx.coroutines.launch @@ -36,7 +33,7 @@ class MyListFragment : Fragment() { private lateinit var webSeriesEAdapter: WebSeriesAdapter private lateinit var webSeriesHAdapter: WebSeriesAdapter - private lateinit var audioBooksAdapter: AudioBooksAdapter + private lateinit var audioBooksAdapter: FavAudioAdapter private lateinit var karaokeAdapter: KaraokeAdapter private lateinit var gamesAdapter: GamesAdapter @@ -51,7 +48,7 @@ class MyListFragment : Fragment() { // adapters webSeriesEAdapter = WebSeriesAdapter(requireContext(),"1", ::onListGotEmpty) webSeriesHAdapter = WebSeriesAdapter(requireContext(),"18", ::onListGotEmpty) - audioBooksAdapter = AudioBooksAdapter(requireContext(), ::onListGotEmpty) + audioBooksAdapter = FavAudioAdapter(requireContext(), ::onListGotEmpty) karaokeAdapter = KaraokeAdapter(requireContext(), ::onListGotEmpty) gamesAdapter = GamesAdapter(requireContext(), ::onListGotEmpty) 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 152909c..ee69de3 100644 --- a/app/src/main/java/com/woka/home/mylist/MyListRepository.kt +++ b/app/src/main/java/com/woka/home/mylist/MyListRepository.kt @@ -2,11 +2,11 @@ package com.woka.home.mylist import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import com.woka.home.mylist.models.AudioData +import com.woka.audiobooks.AudioBookRepository +import com.woka.home.mylist.models.AudioBookData 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.BookmarkedShowData import com.woka.home.mylist.models.Result import com.woka.home.mylist.models.SingKaraokeData import com.woka.networking.ApiResult @@ -17,12 +17,9 @@ 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() { @@ -84,270 +81,4 @@ object MyListRepository { _myFavListLiveData.postValue(response) } } - - fun likePost(postId: String, postType: PostType, categoryId: String = "0"){ - CoroutineScope(Dispatchers.IO).launch { - RetrofitHelper.handleApiCall { - myFavApiService.likePost( - FormBody.Builder() - .add("post_id", postId) - .add("post_type", postType.value) - .build() - ) - } - } - - changeLikeLocally(postId, postType, true) - } - - fun unLikePost(postId: String, postType: PostType) { - CoroutineScope(Dispatchers.IO).launch { - val response = RetrofitHelper.handleApiCall { - myFavApiService.unLikePost( - FormBody.Builder() - .add("post_id", postId) - .add("post_type", postType.value) - .build() - ) - } - } - - changeLikeLocally(postId, postType, false) - } - - fun markAsFavShowLocally(showData: BookmarkedShowData, - addToFav: Boolean, - categoryId: String){ - - CoroutineScope(Dispatchers.IO).launch { - RetrofitHelper.handleApiCall { - if (addToFav){ - myFavApiService.addToFav( - FormBody.Builder() - .add("post_id", "${showData.id}") - .add("post_type", PostType.WEB_SERIES.value) - .add("category_id", categoryId) - .build() - ) - }else{ - myFavApiService.removeFromFav( - FormBody.Builder() - .add("id", "${showData.id}") - .add("post_type", PostType.WEB_SERIES.value) - .add("category_id", categoryId) - .build() - ) - } - } - } - - myFavData.result?.show_data?.let { - var found = false - var showFound: BookmarkedShowData? = null - - for (show in it){ - if (showData.id == show.id){ - - if (addToFav){ - show.addAsBookMark(categoryId) - }else{ - show.removeAsBookMark(categoryId) - } - - showFound = show - found = true - break - } - } - - if (!found && addToFav){ - myFavData.result?.show_data?.add(showData) - } - - if (found){ - showFound?.let {bookMarkShowData -> - if (!bookMarkShowData.isBookMarked()){ - it.remove(bookMarkShowData) - } - } - } - } - - WebSeriesRepository.webSeriesData[categoryId]?.show_data?.let { - for (show in it){ - var found = false - - show?.let {data -> - if (showData.id == data.id){ - found = true - - if (addToFav){ - show.addAsBookMark(categoryId) - }else{ - show.removeAsBookMark(categoryId) - } - } - } - - if (found) break - } - } - } - - 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("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("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("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 -> { - WebSeriesRepository.changeLikeLocally(id, isLiked) - } - - 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/FavAudioAdapter.kt similarity index 57% rename from app/src/main/java/com/woka/home/mylist/adapters/AudioBooksAdapter.kt rename to app/src/main/java/com/woka/home/mylist/adapters/FavAudioAdapter.kt index da7f22f..776f93f 100644 --- a/app/src/main/java/com/woka/home/mylist/adapters/AudioBooksAdapter.kt +++ b/app/src/main/java/com/woka/home/mylist/adapters/FavAudioAdapter.kt @@ -6,28 +6,29 @@ 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.R +import com.woka.audiobooks.AudioBookRepository import com.woka.databinding.FavViewHolderBinding import com.woka.home.mylist.MyListRepository -import com.woka.home.mylist.models.AudioData +import com.woka.home.mylist.models.AudioBookData import com.woka.home.mylist.models.PostType import com.woka.utils.isNetworkConnected import com.woka.utils.toast import java.util.concurrent.Executors import kotlin.math.max -class AudioBooksAdapter(private val context: Context, - config: AsyncDifferConfig, - private val onListEmptyListener: ((postType: PostType, isEng: Boolean) -> Unit)): ListAdapter(config) { +class FavAudioAdapter(private val context: Context, + config: AsyncDifferConfig, + private val onListEmptyListener: ((postType: PostType, isEng: Boolean) -> Unit)): 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 { + private val DIFF_UTIL = object : DiffUtil.ItemCallback(){ + override fun areItemsTheSame(oldItem: AudioBookData, newItem: AudioBookData): Boolean = oldItem.id == newItem.id + override fun areContentsTheSame(oldItem: AudioBookData, newItem: AudioBookData): Boolean { return oldItem.title == newItem.title && oldItem.is_liked == newItem.is_liked && - oldItem.likes_count == newItem.likes_count + oldItem.likes_count == newItem.likes_count && + oldItem.mark_as_favourite == newItem.mark_as_favourite } } @@ -73,28 +74,7 @@ class AudioBooksAdapter(private val context: Context, return@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 @@ -105,20 +85,6 @@ class AudioBooksAdapter(private val context: Context, return@setOnClickListener } - if (fav.isSelected){ - MyListRepository.markAsFavAudioLocally( - audioData, - false - ) - - val currentList = currentList.toMutableList() - currentList.removeAt(holder.absoluteAdapterPosition) - submitList(currentList) - - if (currentList.isEmpty()){ - onListEmptyListener(PostType.AUDIO_BOOKS, false) - } - } } } } 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 index ac34132..6a4baf4 100644 --- a/app/src/main/java/com/woka/home/mylist/adapters/GamesAdapter.kt +++ b/app/src/main/java/com/woka/home/mylist/adapters/GamesAdapter.kt @@ -73,28 +73,7 @@ class GamesAdapter(private val context: Context, return@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 @@ -105,20 +84,7 @@ class GamesAdapter(private val context: Context, return@setOnClickListener } - if (fav.isSelected){ - MyListRepository.markAsFavGameLocally( - gameData, - false - ) - val currentList = currentList.toMutableList() - currentList.removeAt(holder.absoluteAdapterPosition) - submitList(currentList) - - if (currentList.isEmpty()){ - onListEmptyListener(PostType.GAMES, false) - } - } } } } 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 index 4c428df..a4991c3 100644 --- a/app/src/main/java/com/woka/home/mylist/adapters/KaraokeAdapter.kt +++ b/app/src/main/java/com/woka/home/mylist/adapters/KaraokeAdapter.kt @@ -74,28 +74,7 @@ class KaraokeAdapter(private val context: Context, return@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 @@ -106,20 +85,6 @@ class KaraokeAdapter(private val context: Context, return@setOnClickListener } - if (fav.isSelected){ - MyListRepository.markAsFavKaraokeLocally( - karaokeData, - false - ) - - val currentList = currentList.toMutableList() - currentList.removeAt(holder.absoluteAdapterPosition) - submitList(currentList) - - if (currentList.isEmpty()){ - onListEmptyListener(PostType.KARAOKE, false) - } - } } } } 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 33b73cb..c692dc2 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 @@ -9,14 +9,14 @@ import androidx.recyclerview.widget.ListAdapter import com.woka.R import com.woka.WokaApp import com.woka.databinding.FavViewHolderBinding -import com.woka.home.mylist.MyListRepository import com.woka.home.mylist.models.BookmarkedShowData import com.woka.home.mylist.models.PostType import com.woka.utils.isNetworkConnected import com.woka.utils.show import com.woka.utils.toast +import com.woka.webseries.WebSeriesRepository +import com.woka.webseries.models.ShowData import java.util.concurrent.Executors -import kotlin.math.max class WebSeriesAdapter(private val context: Context, private val categoryId: String, @@ -93,19 +93,22 @@ class WebSeriesAdapter(private val context: Context, } if (like.isSelected){ - MyListRepository.unLikePost( + WebSeriesRepository.likeUnLikeShow( "${showData.id}", - PostType.WEB_SERIES + false ) }else{ - MyListRepository.likePost( + WebSeriesRepository.likeUnLikeShow( "${showData.id}", - PostType.WEB_SERIES + true ) } like.isSelected = !like.isSelected likeCount.text = "${showData.likes_count}" + showData.likes_count?.let { + likeCount.text = "$it" + } showData.id?.let { onLikeChanged?.invoke(it) } @@ -131,8 +134,8 @@ class WebSeriesAdapter(private val context: Context, } if (fav.isSelected){ - MyListRepository.markAsFavShowLocally( - showData, + WebSeriesRepository.updateFavShow( + ShowData(showData), false, categoryId ) diff --git a/app/src/main/java/com/woka/home/mylist/models/AudioData.kt b/app/src/main/java/com/woka/home/mylist/models/AudioBookData.kt similarity index 90% rename from app/src/main/java/com/woka/home/mylist/models/AudioData.kt rename to app/src/main/java/com/woka/home/mylist/models/AudioBookData.kt index 865a3ba..cd11736 100644 --- a/app/src/main/java/com/woka/home/mylist/models/AudioData.kt +++ b/app/src/main/java/com/woka/home/mylist/models/AudioBookData.kt @@ -1,6 +1,6 @@ package com.woka.home.mylist.models -data class AudioData( +data class AudioBookData( val age_range_master_id: String?, val audio_duration: String?, val audio_url: String?, @@ -14,7 +14,7 @@ data class AudioData( var is_liked: Boolean?, val language_master_id: Int?, var likes_count: Int?, - val mark_as_favourite: Boolean?, + var mark_as_favourite: Boolean?, val media_id: String?, val release_date: String?, val tags_keyword: String?, diff --git a/app/src/main/java/com/woka/home/mylist/models/Result.kt b/app/src/main/java/com/woka/home/mylist/models/Result.kt index 493d0a3..8a1777c 100644 --- a/app/src/main/java/com/woka/home/mylist/models/Result.kt +++ b/app/src/main/java/com/woka/home/mylist/models/Result.kt @@ -1,7 +1,7 @@ package com.woka.home.mylist.models data class Result( - val audio_data: MutableList?, + val audio_data: MutableList?, val game_data: MutableList?, val show_data: MutableList?, val sing_karaoke_data: MutableList?, diff --git a/app/src/main/java/com/woka/modules/ModuleApiService.kt b/app/src/main/java/com/woka/modules/ModuleApiService.kt index 48af77d..f11e06d 100644 --- a/app/src/main/java/com/woka/modules/ModuleApiService.kt +++ b/app/src/main/java/com/woka/modules/ModuleApiService.kt @@ -1,5 +1,6 @@ package com.woka.modules +import com.woka.audiobooks.models.continuedata.ContinueAudioResponse import com.woka.modules.blogs.models.BlogsResponse import com.woka.modules.categorymodels.CategoriesResponse import com.woka.modules.faqs.models.FaqResponse @@ -31,7 +32,4 @@ interface ModuleApiService { @POST("category_listing") suspend fun categoryListing(@Body body: FormBody): Response> - - @POST("continue_watching") - suspend fun continueWatchingShowListing(@Body body: FormBody): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt index 222496f..7806e34 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt @@ -19,6 +19,8 @@ import com.woka.home.views.HomeActivity import com.woka.userdata.userDataModels.UserDataResponse import com.woka.networking.ApiResult import com.woka.userPreference.UserType +import com.woka.utils.hide +import com.woka.utils.show import com.woka.utils.toast import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -52,6 +54,18 @@ class SplashFragment : Fragment(), Observer?> { // thus, loading data userPrefs?.loadUserData() } + + clickEvents() + } + + private fun clickEvents() { + binding.apply { + retryBtn.setOnClickListener { + retryBtn.hide() + progressBar.show() + userPrefs?.loadUserData() + } + } } private fun playBgMusic() { @@ -118,9 +132,13 @@ class SplashFragment : Fragment(), Observer?> { when (value){ is ApiResult.Error -> { toast(value.errorMessage) + binding.retryBtn.show() + binding.progressBar.hide() } is ApiResult.Loading -> {} is ApiResult.Success -> { + binding.retryBtn.hide() + binding.progressBar.hide() goForward() } diff --git a/app/src/main/java/com/woka/userPreference/UserPreference.kt b/app/src/main/java/com/woka/userPreference/UserPreference.kt index 2dc6ff0..b31717a 100644 --- a/app/src/main/java/com/woka/userPreference/UserPreference.kt +++ b/app/src/main/java/com/woka/userPreference/UserPreference.kt @@ -8,6 +8,7 @@ import android.content.SharedPreferences import android.provider.Settings.Secure import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import com.woka.audiobooks.AudioBookRepository import com.woka.home.models.Theme import com.woka.home.mylist.MyListRepository import com.woka.networking.ApiResult @@ -115,5 +116,6 @@ class UserPreference(val context: Context) { private fun clearData(){ WebSeriesRepository.clearData() MyListRepository.clearData() + AudioBookRepository.clearData() } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/MyFavApiService.kt b/app/src/main/java/com/woka/userdata/UserActionApiService.kt similarity index 54% rename from app/src/main/java/com/woka/home/mylist/MyFavApiService.kt rename to app/src/main/java/com/woka/userdata/UserActionApiService.kt index 92dd5a0..0ff1fcf 100644 --- a/app/src/main/java/com/woka/home/mylist/MyFavApiService.kt +++ b/app/src/main/java/com/woka/userdata/UserActionApiService.kt @@ -1,12 +1,14 @@ -package com.woka.home.mylist +package com.woka.userdata +import com.woka.audiobooks.models.continuedata.ContinueAudioResponse import com.woka.networking.ApiResponse +import com.woka.webseries.models.ContinueEpisodeResponse import okhttp3.FormBody import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST -interface MyFavApiService { +interface UserActionApiService { @POST("post_like") suspend fun likePost(@Body body: FormBody): Response> @@ -19,4 +21,10 @@ interface MyFavApiService { @POST("favourite_remove") suspend fun removeFromFav(@Body body: FormBody): Response> + + @POST("continue_watching") + suspend fun continueWatchingShowListing(@Body body: FormBody): Response> + + @POST("continue_watching") + suspend fun continueAudioBookListing(@Body body: FormBody): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/woka/userdata/UserApiService.kt b/app/src/main/java/com/woka/userdata/UserApiService.kt index 66c24f4..ec574b5 100644 --- a/app/src/main/java/com/woka/userdata/UserApiService.kt +++ b/app/src/main/java/com/woka/userdata/UserApiService.kt @@ -1,9 +1,11 @@ package com.woka.userdata +import com.woka.audiobooks.models.continuedata.ContinueAudioResponse import com.woka.home.mylist.models.MyListResponse import com.woka.home.notifications.models.NotificationData import com.woka.userdata.userDataModels.UserDataResponse import com.woka.networking.ApiResponse +import com.woka.webseries.models.ContinueEpisodeResponse import okhttp3.FormBody import retrofit2.Response import retrofit2.http.Body diff --git a/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt b/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt index ca35f1d..e5ad08b 100644 --- a/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt +++ b/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt @@ -3,7 +3,6 @@ package com.woka.webseries import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.jwplayer.pub.api.media.playlists.PlaylistItem -import com.woka.home.mylist.MyFavApiService import com.woka.home.mylist.MyListRepository import com.woka.home.mylist.models.BookmarkedShowData import com.woka.home.mylist.models.PostType @@ -12,6 +11,7 @@ import com.woka.networking.ApiResult import com.woka.networking.RetrofitHelper import com.woka.players.models.VideoPlayList import com.woka.players.models.VideoViewRequestData +import com.woka.userdata.UserActionApiService import com.woka.webseries.models.ContinueEpisodeResponse import com.woka.webseries.models.ShowData import com.woka.webseries.models.WebSeriesResponse @@ -27,8 +27,7 @@ import kotlin.math.max object WebSeriesRepository { // api services private val apiService = RetrofitHelper.getRetrofit().create(WebSeriesApiService::class.java) - private val myFavApiService = RetrofitHelper.getRetrofit().create(MyFavApiService::class.java) - private val moduleApiService = RetrofitHelper.getRetrofit().create(ModuleApiService::class.java) + private val userActionApiService = RetrofitHelper.getRetrofit().create(UserActionApiService::class.java) // live data @@ -42,32 +41,10 @@ object WebSeriesRepository { // continue watching (tight caching) private val _continueWatchLiveData = MutableLiveData>() val continueWatchLiveData: LiveData> - get() { - if (shallLoadNewContinueWatchData){ - // load new data - loadContinueWatchData() - shallLoadNewContinueWatchData = false - }else{ - // also updating local changes - continueWatchData?.let { - _continueWatchLiveData.postValue(ApiResult.Success(it)) - } - } - return _continueWatchLiveData - } + get() = _continueWatchLiveData var continueWatchData: ContinueEpisodeResponse? = null - init { - loadContinueWatchData() - } - - /* - flag to load a new data whenever necessary - for eg. when user has signed in with new account and the apps hold the older repository - */ - private var shallLoadNewContinueWatchData: Boolean = false - // seasonListing data private val _seasonDataLiveData = MutableLiveData>() val seasonDataLiveData: LiveData> @@ -262,6 +239,7 @@ object WebSeriesRepository { _seasonDataLiveData.postValue(ApiResult.Success(data = seasonDataMap["${showId}_${categoryId}"])) return } + CoroutineScope(Dispatchers.IO).launch { _seasonDataLiveData.postValue(ApiResult.Loading()) val response = RetrofitHelper.handleApiCall { @@ -287,11 +265,16 @@ object WebSeriesRepository { } } - private fun loadContinueWatchData(){ + fun loadContinueWatchData(){ + if (continueWatchData != null){ + _continueWatchLiveData.postValue(ApiResult.Success(continueWatchData)) + return + } + CoroutineScope(Dispatchers.IO).launch { _continueWatchLiveData.postValue(ApiResult.Loading()) val response = RetrofitHelper.handleApiCall { - moduleApiService.continueWatchingShowListing( + userActionApiService.continueWatchingShowListing( FormBody.Builder() .add("post_type", "3") .build() @@ -346,18 +329,18 @@ object WebSeriesRepository { } } - fun likeUnLikeShow(postId: String, likeIt: Boolean, categoryId: String){ + fun likeUnLikeShow(postId: String, likeIt: Boolean){ CoroutineScope(Dispatchers.IO).launch { RetrofitHelper.handleApiCall { if (likeIt){ - myFavApiService.likePost( + userActionApiService.likePost( FormBody.Builder() .add("post_id", postId) .add("post_type", PostType.WEB_SERIES.value) .build() ) }else{ - myFavApiService.unLikePost( + userActionApiService.unLikePost( FormBody.Builder() .add("post_id", postId) .add("post_type", PostType.WEB_SERIES.value) @@ -365,12 +348,12 @@ object WebSeriesRepository { ) } } - - changeLikeLocally(postId, likeIt) } + + changeLikeLocally(postId, likeIt) } - fun changeLikeLocally(id: String, isLiked: Boolean){ + private fun changeLikeLocally(id: String, isLiked: Boolean){ // changing in web series locally for (showDataResponse in webSeriesData.values){ showDataResponse.show_data?.let {shows -> @@ -395,7 +378,7 @@ object WebSeriesRepository { } // changing in fav list locally - MyListRepository.myFavData?.result?.show_data?.let { + MyListRepository.myFavData.result?.show_data?.let { for (show in it){ if ("${show.id}" == id){ show.is_liked = isLiked @@ -410,18 +393,86 @@ object WebSeriesRepository { } fun updateFavShow(showData: ShowData, addToBookmark: Boolean, categoryId: String){ - MyListRepository.markAsFavShowLocally( - BookmarkedShowData(showData, categoryId), - addToBookmark, - categoryId - ) + CoroutineScope(Dispatchers.IO).launch { + RetrofitHelper.handleApiCall { + if (addToBookmark){ + userActionApiService.addToFav( + FormBody.Builder() + .add("post_id", "${showData.id}") + .add("post_type", PostType.WEB_SERIES.value) + .add("category_id", categoryId) + .build() + ) + }else{ + userActionApiService.removeFromFav( + FormBody.Builder() + .add("id", "${showData.id}") + .add("post_type", PostType.WEB_SERIES.value) + .add("category_id", categoryId) + .build() + ) + } + } + } + + MyListRepository.myFavData.result?.show_data?.let { + var found = false + var showFound: BookmarkedShowData? = null + + for (show in it){ + if (showData.id == show.id){ + + if (addToBookmark){ + show.addAsBookMark(categoryId) + }else{ + show.removeAsBookMark(categoryId) + } + + showFound = show + found = true + break + } + } + + if (!found && addToBookmark){ + MyListRepository.myFavData.result?.show_data?.add(BookmarkedShowData(showData, categoryId)) + } + + if (found){ + showFound?.let {bookMarkShowData -> + if (!bookMarkShowData.isBookMarked()){ + it.remove(bookMarkShowData) + } + } + } + } + + webSeriesData[categoryId]?.show_data?.let { + for (show in it){ + var found = false + + show?.let {data -> + if (showData.id == data.id){ + found = true + + if (addToBookmark){ + show.addAsBookMark(categoryId) + }else{ + show.removeAsBookMark(categoryId) + } + } + } + + if (found) break + } + } } fun clearData(){ _webSeriesLiveData.postValue(ApiResult.Loading()) - webSeriesData.clear() + _continueWatchLiveData.postValue(ApiResult.Loading()) - shallLoadNewContinueWatchData = true + webSeriesData.clear() continueWatchData = null } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/webseries/adapters/WebSeriesShowAdapter.kt b/app/src/main/java/com/woka/webseries/adapters/WebSeriesShowAdapter.kt index 6a5f873..226bd04 100644 --- a/app/src/main/java/com/woka/webseries/adapters/WebSeriesShowAdapter.kt +++ b/app/src/main/java/com/woka/webseries/adapters/WebSeriesShowAdapter.kt @@ -84,23 +84,15 @@ class WebSeriesShowAdapter( return@setOnClickListener } - categoryId?.let { - if (like.isSelected){ - WebSeriesRepository.likeUnLikeShow("${showData.id}", false, it) + if (like.isSelected){ + WebSeriesRepository.likeUnLikeShow("${showData.id}", false) + }else{ + WebSeriesRepository.likeUnLikeShow("${showData.id}", true) + } - showData.likes_count?.let {likeCountInt -> - likeCount.text = "${max(likeCountInt - 1, 0)}" - } - }else{ - WebSeriesRepository.likeUnLikeShow("${showData.id}", true, it) - - showData.likes_count?.let {likeCountInt -> - val value = likeCountInt + 1 - likeCount.text = "$value" - } - } - - like.isSelected = !like.isSelected + like.isSelected = !like.isSelected + showData.likes_count?.let { + likeCount.text = "$it" } } diff --git a/app/src/main/java/com/woka/webseries/models/ContinueEpisodeResponse.kt b/app/src/main/java/com/woka/webseries/models/ContinueEpisodeResponse.kt index 158cac1..c059a1b 100644 --- a/app/src/main/java/com/woka/webseries/models/ContinueEpisodeResponse.kt +++ b/app/src/main/java/com/woka/webseries/models/ContinueEpisodeResponse.kt @@ -1,6 +1,6 @@ package com.woka.webseries.models data class ContinueEpisodeResponse( - val result: List?, + val result: List?, val total_records: Int? ) \ No newline at end of file diff --git a/app/src/main/java/com/woka/webseries/views/SeasonActivity.kt b/app/src/main/java/com/woka/webseries/views/SeasonActivity.kt index 84998d3..b507f5f 100644 --- a/app/src/main/java/com/woka/webseries/views/SeasonActivity.kt +++ b/app/src/main/java/com/woka/webseries/views/SeasonActivity.kt @@ -201,27 +201,18 @@ class SeasonActivity : WokaBaseActivity(), OnTabSelectedListener { return@setOnClickListener } - categoryId?.let { - if (likeSeason.isSelected) { - WebSeriesRepository.likeUnLikeShow("${showData?.id}", false, it) - - showData?.likes_count?.let { likeCountInt -> - likeCount.text = "${max(likeCountInt - 1, 0)}" - } - } else { - WebSeriesRepository.likeUnLikeShow("${showData?.id}", true, it) - - showData?.likes_count?.let { likeCountInt -> - val value = likeCountInt + 1 - likeCount.text = "$value" - } - } - - likeSeason.isSelected = !likeSeason.isSelected - setResult(RESULT_OK, Intent().apply { - putExtra(EXTRA_SHOW_ID, showId) - }) + if (likeSeason.isSelected) { + WebSeriesRepository.likeUnLikeShow("${showData?.id}", false) + } else { + WebSeriesRepository.likeUnLikeShow("${showData?.id}", true) } + + likeSeason.isSelected = !likeSeason.isSelected + likeCount.text = "${showData?.likes_count}" + + setResult(RESULT_OK, Intent().apply { + putExtra(EXTRA_SHOW_ID, showId) + }) } favSeason.setOnClickListener { diff --git a/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt b/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt index 45d2b61..d81ace5 100644 --- a/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt +++ b/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt @@ -225,6 +225,7 @@ class WebSeriesActivity : WokaBaseActivity(), Observer @@ -142,7 +142,7 @@ android:layout_height="wrap_content" app:layout_scrollFlags="scroll|snap|exitUntilCollapsed"> -