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 7b2a338..3c97e50 100644 --- a/app/src/main/java/com/woka/home/fragments/MyListFragment.kt +++ b/app/src/main/java/com/woka/home/fragments/MyListFragment.kt @@ -1,10 +1,14 @@ package com.woka.home.fragments +import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.SimpleItemAnimator @@ -19,6 +23,8 @@ import com.woka.home.mylist.models.BookmarkedShowData import com.woka.networking.ApiResult 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 class MyListFragment : Fragment() { @@ -31,6 +37,8 @@ class MyListFragment : Fragment() { private lateinit var karaokeAdapter: KaraokeAdapter private lateinit var gamesAdapter: GamesAdapter + private var webShowIntentLauncher: ActivityResultLauncher? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -50,14 +58,21 @@ class MyListFragment : Fragment() { setObservers() + registerIntentLaunchers() + return binding.root } private fun initViews() { binding.apply { (rvWebSeriesEnglish.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false + (rvWebSeriesHindi.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false rvWebSeriesEnglish.adapter = webSeriesEAdapter rvWebSeriesHindi.adapter = webSeriesHAdapter + + webSeriesHAdapter.onShowClickListener = ::onWebShowClicked + webSeriesEAdapter.onShowClickListener = ::onWebShowClicked + rvAudioBooks.adapter = audioBooksAdapter rvKaraoke.adapter = karaokeAdapter rvGames.adapter = gamesAdapter @@ -72,6 +87,28 @@ class MyListFragment : Fragment() { } } + private fun registerIntentLaunchers(){ + webShowIntentLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ + if (it.resultCode == AppCompatActivity.RESULT_OK){ + it.data?.getIntExtra(SeasonActivity.EXTRA_SHOW_POSITION, -1)?.let { position -> + it.data?.getStringExtra(SeasonActivity.EXTRA_SHOW_CATEGORY_DATA)?.let {categoryId -> + if (categoryId == "1"){ + // english + if (position > -1 && position < webSeriesEAdapter.itemCount){ + webSeriesEAdapter.notifyItemChanged(position) + } + }else if (categoryId == "18"){ + // hindi + if (position > -1 && position < webSeriesHAdapter.itemCount){ + webSeriesHAdapter.notifyItemChanged(position) + } + } + } + } + } + } + } + private fun setObservers(){ binding.apply { MyListRepository.myFavListLiveData.observe(viewLifecycleOwner){ @@ -206,6 +243,14 @@ class MyListFragment : Fragment() { } } + private fun onWebShowClicked(showData: BookmarkedShowData, position:Int, categoryId: String){ + webShowIntentLauncher?.launch(Intent(context, SeasonActivity::class.java).apply { + putExtra(SeasonActivity.EXTRA_SHOW_ID, showData.id) + putExtra(SeasonActivity.EXTRA_SHOW_CATEGORY_DATA, categoryId) + putExtra(SeasonActivity.EXTRA_SHOW_POSITION, position) + }) + } + companion object { fun newInstance() = MyListFragment() } 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 1fcfb67..61000c0 100644 --- a/app/src/main/java/com/woka/home/mylist/MyListRepository.kt +++ b/app/src/main/java/com/woka/home/mylist/MyListRepository.kt @@ -74,7 +74,7 @@ object MyListRepository { fun likePost(postId: String, postType: PostType, categoryId: String = "0"){ CoroutineScope(Dispatchers.IO).launch { - val response = RetrofitHelper.handleApiCall { + RetrofitHelper.handleApiCall { myFavApiService.likePost( FormBody.Builder() .add("post_id", postId) @@ -83,13 +83,7 @@ object MyListRepository { ) } - when (response){ - is ApiResult.Error -> {} - is ApiResult.Loading -> {} - is ApiResult.Success -> { - changeLikeLocally(postId, postType, true) - } - } + changeLikeLocally(postId, postType, true) } } @@ -104,13 +98,7 @@ object MyListRepository { ) } - when (response) { - is ApiResult.Error -> {} - is ApiResult.Loading -> {} - is ApiResult.Success -> { - changeLikeLocally(postId, postType, false) - } - } + changeLikeLocally(postId, postType, false) } } @@ -119,7 +107,7 @@ object MyListRepository { categoryId: String){ CoroutineScope(Dispatchers.IO).launch { - val response = RetrofitHelper.handleApiCall { + RetrofitHelper.handleApiCall { if (addToFav){ myFavApiService.addToFav( FormBody.Builder() @@ -139,45 +127,39 @@ object MyListRepository { } } - when (response){ - is ApiResult.Error -> {} - is ApiResult.Loading -> {} - is ApiResult.Success -> { - if (myFavData == null && myFavListLiveData.isInitialized){ - loadMyFavList() - }else{ - myFavData?.result?.show_data?.let { - for (show in it){ - if (showData.id == show.id){ - if (addToFav){ - show.addAsBookMark(categoryId) - }else{ - show.removeAsBookMark(categoryId) - } - } + if (myFavData == null && myFavListLiveData.isInitialized){ + loadMyFavList() + }else{ + myFavData?.result?.show_data?.let { + for (show in it){ + if (showData.id == show.id){ + if (addToFav){ + show.addAsBookMark(categoryId) + }else{ + show.removeAsBookMark(categoryId) + } + } + } + } + } + + 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) } } } - 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 - } - } + if (found) break } } } 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 b2977af..cb78d51 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 @@ -6,12 +6,12 @@ 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.WokaApp import com.woka.databinding.FavViewHolderBinding import com.woka.home.mylist.MyListRepository -import com.woka.home.mylist.models.PostType 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 @@ -38,6 +38,8 @@ class WebSeriesAdapter(private val context: Context, .build() } + var onShowClickListener: ((BookmarkedShowData, Int, String) -> Unit)? = null + constructor(context: Context, categoryId: String, onListEmptyListener: ((postType: PostType, isEng: Boolean) -> Unit)): this(context, categoryId, onListEmptyListener, DIFF_CONFIG) @@ -60,7 +62,17 @@ class WebSeriesAdapter(private val context: Context, image.loadImage(it) } - title.text = showData.title + showData.content_more_details?.let {moreDetailsList -> + title.text = if (moreDetailsList.isNotEmpty()){ + if (WokaApp.userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ + moreDetailsList[1]?.title + }else{ + moreDetailsList[0]?.title + } + }else{ + showData.title + } + } likeCount.show() like.show() @@ -104,7 +116,17 @@ class WebSeriesAdapter(private val context: Context, } fav.show() - fav.isSelected = true + if (showData.isBookMarked(categoryId)){ + fav.isSelected = true + }else{ + val currentList = currentList.toMutableList() + currentList.removeAt(holder.absoluteAdapterPosition) + submitList(currentList) + + if (currentList.isEmpty()){ + onListEmptyListener(PostType.WEB_SERIES, categoryId == "1") + } + } fav.setOnClickListener { if (!context.isNetworkConnected()){ @@ -128,6 +150,11 @@ class WebSeriesAdapter(private val context: Context, } } } + + card.setOnClickListener { + onShowClickListener?.invoke(showData, position, categoryId) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/models/BookmarkedShowData.kt b/app/src/main/java/com/woka/home/mylist/models/BookmarkedShowData.kt index d4df164..cbcdbb4 100644 --- a/app/src/main/java/com/woka/home/mylist/models/BookmarkedShowData.kt +++ b/app/src/main/java/com/woka/home/mylist/models/BookmarkedShowData.kt @@ -21,8 +21,8 @@ data class BookmarkedShowData( val total_episodes: Int?, val total_seasons: Int?, val views_count: Int? -){ - constructor(showData: ShowData, categoryIds: String): this( +) { + constructor(showData: ShowData, categoryIds: String) : this( showData.age_range_master_id, categoryIds, showData.bookmark_count, @@ -42,13 +42,29 @@ data class BookmarkedShowData( showData.views_count ) - fun addAsBookMark(categoryId: String){ - val categories = bookmark_category_ids?.split(",")?.toMutableList()?: mutableListOf() + fun isBookMarked(categoryId: String): Boolean { + bookmark_category_ids?.split(",")?.toMutableList()?.let { + return it.contains(categoryId) + } + + return false + } + + fun addAsBookMark(categoryId: String) { + val categories = bookmark_category_ids?.let { + if (it.isEmpty()){ + ArrayList() + }else{ + it.split(",").toMutableList() + } + }?:ArrayList() + + categories.remove("0") // unwanted id categories.add(categoryId) bookmark_category_ids = categories.joinToString(",") } - fun removeAsBookMark(categoryId: String){ + fun removeAsBookMark(categoryId: String) { bookmark_category_ids?.split(",")?.toMutableList()?.let { it.remove(categoryId) bookmark_category_ids = it.joinToString(",") diff --git a/app/src/main/java/com/woka/players/LiveStreamPlayerActivity.kt b/app/src/main/java/com/woka/players/LiveStreamPlayerActivity.kt index ffaec51..959c789 100644 --- a/app/src/main/java/com/woka/players/LiveStreamPlayerActivity.kt +++ b/app/src/main/java/com/woka/players/LiveStreamPlayerActivity.kt @@ -89,12 +89,11 @@ class LiveStreamPlayerActivity : AppCompatActivity(), FullscreenHandler { override fun onFullscreenRequested() {} override fun onFullscreenExitRequested() { - player.stop() val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) - finish() + onBackPressedDispatcher.onBackPressed() } override fun onAllowRotationChanged(allowRotation: Boolean) {} diff --git a/app/src/main/java/com/woka/players/PlayerActivity.kt b/app/src/main/java/com/woka/players/PlayerActivity.kt index 2ee42cb..0816861 100644 --- a/app/src/main/java/com/woka/players/PlayerActivity.kt +++ b/app/src/main/java/com/woka/players/PlayerActivity.kt @@ -70,12 +70,11 @@ class PlayerActivity : AppCompatActivity(), FullscreenHandler { override fun onFullscreenRequested() {} override fun onFullscreenExitRequested() { - player.stop() val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) - finish() + onBackPressedDispatcher.onBackPressed() } override fun onAllowRotationChanged(allowRotation: Boolean) {} diff --git a/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt b/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt index e214cf7..639a11d 100644 --- a/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt +++ b/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt @@ -329,7 +329,7 @@ object WebSeriesRepository { fun likeUnLikeShow(postId: String, likeIt: Boolean, categoryId: String){ CoroutineScope(Dispatchers.IO).launch { - val response = RetrofitHelper.handleApiCall { + RetrofitHelper.handleApiCall { if (likeIt){ myFavApiService.likePost( FormBody.Builder() @@ -347,13 +347,7 @@ object WebSeriesRepository { } } - when (response){ - is ApiResult.Error -> {} - is ApiResult.Loading -> {} - is ApiResult.Success -> { - changeLikeLocally(postId, likeIt) - } - } + changeLikeLocally(postId, likeIt) } } diff --git a/app/src/main/java/com/woka/webseries/adapters/ContinueEpisodeAdapter.kt b/app/src/main/java/com/woka/webseries/adapters/ContinueEpisodeAdapter.kt index 3f5b3f4..fd1226e 100644 --- a/app/src/main/java/com/woka/webseries/adapters/ContinueEpisodeAdapter.kt +++ b/app/src/main/java/com/woka/webseries/adapters/ContinueEpisodeAdapter.kt @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.bumptech.glide.Glide +import com.woka.WokaApp.Companion.userPrefs import com.woka.databinding.ContinueShowViewHolderBinding import com.woka.webseries.models.ContinueEpisodeData import java.util.concurrent.Executors @@ -48,13 +49,20 @@ class ContinueEpisodeAdapter(val context: Context, holder.binding.apply { episode.thumbnail_path?.let { - Glide.with(context.applicationContext) - .load(it) - .error(android.R.color.darker_gray) - .into(image) + image.loadImage(it) } - title.text = episode.episode_title + title.text = episode.content_more_details?.let {moreDetailsList -> + if (moreDetailsList.isNotEmpty()){ + if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ + moreDetailsList[1].title + }else{ + moreDetailsList[0].title + } + }else{ + episode.episode_title + } + } val detail = "S${episode.season_number}-E${episode.episode_number}" details.text = detail } diff --git a/app/src/main/java/com/woka/webseries/adapters/EpisodeAdapter.kt b/app/src/main/java/com/woka/webseries/adapters/EpisodeAdapter.kt index f14a38c..a21b9c2 100644 --- a/app/src/main/java/com/woka/webseries/adapters/EpisodeAdapter.kt +++ b/app/src/main/java/com/woka/webseries/adapters/EpisodeAdapter.kt @@ -35,7 +35,8 @@ class EpisodeAdapter private constructor(val context: Context, constructor(context: Context): this(context, DIFF_CONFIG) - var onEpisodeClicked: ((position: Int) -> Unit)? = null + var onEpisodeClicked: ((position: Int, episodeData: EpisodeData) -> Unit)? = null + var onEpisodePlayClicked: ((position: Int) -> Unit)? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EpisodeViewHolder { return EpisodeViewHolder( @@ -69,10 +70,12 @@ class EpisodeAdapter private constructor(val context: Context, } } + playBtn.setOnClickListener { + onEpisodePlayClicked?.invoke(holder.absoluteAdapterPosition) + } + card.setOnClickListener { - episode.id?.let { episodeId -> - onEpisodeClicked?.invoke(holder.absoluteAdapterPosition) - } + onEpisodeClicked?.invoke(position, episode) } } } diff --git a/app/src/main/java/com/woka/webseries/adapters/TeaserAdapter.kt b/app/src/main/java/com/woka/webseries/adapters/TeaserAdapter.kt index 55e069b..75f64e9 100644 --- a/app/src/main/java/com/woka/webseries/adapters/TeaserAdapter.kt +++ b/app/src/main/java/com/woka/webseries/adapters/TeaserAdapter.kt @@ -1,6 +1,5 @@ package com.woka.webseries.adapters; - import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup @@ -35,7 +34,8 @@ class TeaserAdapter private constructor(val context: Context, constructor(context: Context): this(context, DIFF_CONFIG) - var onEpisodeClicked: ((position: Int) -> Unit)? = null + var onEpisodeClicked: ((position: Int, teaserData: TeaserData) -> Unit)? = null + var onEpisodePlayClicked: ((position: Int) -> Unit)? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EpisodeViewHolder { return EpisodeViewHolder( @@ -69,9 +69,14 @@ class TeaserAdapter private constructor(val context: Context, } } - card.setOnClickListener { - onEpisodeClicked?.invoke(holder.absoluteAdapterPosition) + playBtn.setOnClickListener { + onEpisodePlayClicked?.invoke(holder.absoluteAdapterPosition) } + + card.setOnClickListener { + onEpisodeClicked?.invoke(position, episode) + } + } } } \ 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 f0979e5..8de8cde 100644 --- a/app/src/main/java/com/woka/webseries/adapters/WebSeriesShowAdapter.kt +++ b/app/src/main/java/com/woka/webseries/adapters/WebSeriesShowAdapter.kt @@ -7,6 +7,7 @@ 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.databinding.ShowViewHolderBinding import com.woka.utils.isNetworkConnected import com.woka.utils.show @@ -53,7 +54,17 @@ class WebSeriesShowAdapter( image.loadImage(it) } - title.text = showData.title + showData.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{ + showData.title + } + } like.show() likeCount.show() diff --git a/app/src/main/java/com/woka/webseries/models/ShowData.kt b/app/src/main/java/com/woka/webseries/models/ShowData.kt index a22fc16..f09e117 100644 --- a/app/src/main/java/com/woka/webseries/models/ShowData.kt +++ b/app/src/main/java/com/woka/webseries/models/ShowData.kt @@ -1,5 +1,9 @@ package com.woka.webseries.models +import android.util.Log +import com.woka.home.mylist.models.BookmarkedShowData +import com.woka.utils.TAG + data class ShowData( val age_range_data: List?, val age_range_master_id: String?, @@ -24,6 +28,30 @@ data class ShowData( val views_count: Int? ){ + constructor(bookMarkShowData: BookmarkedShowData): this( + null, + bookMarkShowData.age_range_master_id, + bookMarkShowData.bookmark_count, + null, + bookMarkShowData.category_master_id, + bookMarkShowData.content_more_details, + bookMarkShowData.description, + bookMarkShowData.bookmark_category_ids, + null, + bookMarkShowData.gender_master_id, + bookMarkShowData.id, + bookMarkShowData.is_liked, + bookMarkShowData.bookmark_category_ids, + bookMarkShowData.likes_count, + bookMarkShowData.mark_as_favourite, + bookMarkShowData.show_type, + bookMarkShowData.thumbnail_path, + bookMarkShowData.title, + bookMarkShowData.total_episodes, + bookMarkShowData.total_seasons, + bookMarkShowData.views_count + ) + fun isBookMarked(categoryId: String): Boolean{ favourite_category_ids?.split(",")?.toMutableList()?.let { return it.contains(categoryId) @@ -32,7 +60,15 @@ data class ShowData( return false } fun addAsBookMark(categoryId: String){ - val categories = favourite_category_ids?.split(",")?.toMutableList()?: mutableListOf() + val categories = favourite_category_ids?.let { + if (it.isEmpty()){ + ArrayList() + }else{ + it.split(",").toMutableList() + } + }?:ArrayList() + + categories.remove("0") categories.add(categoryId) favourite_category_ids = categories.joinToString(",") } 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 487fb36..19c7314 100644 --- a/app/src/main/java/com/woka/webseries/views/SeasonActivity.kt +++ b/app/src/main/java/com/woka/webseries/views/SeasonActivity.kt @@ -1,9 +1,14 @@ package com.woka.webseries.views +import android.app.Dialog import android.content.Intent import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.InsetDrawable import android.os.Bundle +import android.os.Parcelable import android.text.Html +import android.view.WindowManager import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat @@ -14,11 +19,15 @@ import com.jwplayer.pub.api.media.playlists.PlaylistItem import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.databinding.ActivitySeasonBinding +import com.woka.databinding.DialogEpisodeBinding +import com.woka.home.mylist.MyListRepository +import com.woka.home.mylist.models.BookmarkedShowData import com.woka.networking.ApiResult import com.woka.players.PlayerActivity import com.woka.players.PlayerActivity.Companion.EXTRA_EPISODE_INDEX import com.woka.players.PlayerActivity.Companion.EXTRA_PLAY_LIST import com.woka.utils.ProgressView +import com.woka.utils.WokaBaseActivity import com.woka.utils.hide import com.woka.utils.isNetworkConnected import com.woka.utils.lightStatusBar @@ -28,11 +37,13 @@ import com.woka.webseries.WebSeriesRepository import com.woka.webseries.adapters.EpisodeAdapter import com.woka.webseries.adapters.TeaserAdapter import com.woka.webseries.models.ShowData +import com.woka.webseries.models.episodedata.EpisodeData +import com.woka.webseries.models.teaserdata.TeaserData import kotlin.math.max -class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { +class SeasonActivity : WokaBaseActivity(), OnTabSelectedListener { - companion object{ + companion object { const val EXTRA_SHOW_ID = "extra_show_id_data" const val EXTRA_SHOW_CATEGORY_DATA = "extra_show_category_data" const val EXTRA_SHOW_POSITION = "extra_show_position" @@ -53,6 +64,9 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { private var selectedSeasonId = -1 + private lateinit var episodeDialogBinding: DialogEpisodeBinding + private lateinit var episodeDialog: Dialog + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() @@ -64,7 +78,7 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { insets } - with(window){ + with(window) { statusBarColor = Color.parseColor("#D3EFF8") lightStatusBar(true) } @@ -73,7 +87,7 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { categoryId = intent.getStringExtra(EXTRA_SHOW_CATEGORY_DATA) showPosition = intent.getIntExtra(EXTRA_SHOW_POSITION, -1) - if (showId == -1 || categoryId == null){ + if (showId == -1 || categoryId == null) { finish() return } @@ -85,16 +99,29 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { progressView.show(getString(R.string.please_wait)) WebSeriesRepository.webSeriesData[categoryId]?.show_data?.let { - for (show in it){ - if (showId == show?.id){ + for (show in it) { + if (showId == show?.id) { showData = show break } } } + if (showData == null){ + MyListRepository.myFavData?.result?.show_data?.let { + for (show in it){ + if (showId == show.id){ + showData = ShowData(show) + break + } + } + } + } + initViews() + initEpisodeDialog() + clickEvents() setObservers() @@ -115,44 +142,79 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { favSeason.isSelected = showData!!.isBookMarked(categoryId!!) - likeSeason.isSelected = showData!!.is_liked?:false + likeSeason.isSelected = showData!!.is_liked ?: false binding.seasonsTab.addOnTabSelectedListener(this@SeasonActivity) - image.onLoadSuccessListener = {playTrailer.show()} + image.onLoadSuccessListener = { playTrailer.show() } rvEpisodes.adapter = episodeAdapter episodeAdapter.onEpisodeClicked = ::onEpisodeClicked + episodeAdapter.onEpisodePlayClicked = ::onEpisodePlayClicked rvTeaser.adapter = teaserAdapter teaserAdapter.onEpisodeClicked = ::onTeaserClicked + teaserAdapter.onEpisodePlayClicked = ::onTeaserPlayClicked } } } - private fun clickEvents(){ + + + private fun initEpisodeDialog(){ + episodeDialogBinding = DialogEpisodeBinding.inflate(layoutInflater) + episodeDialog = Dialog(this) + + episodeDialog.setContentView(episodeDialogBinding.root) + + try { + val back = ColorDrawable(Color.TRANSPARENT) + val inset = InsetDrawable(back, 50) + episodeDialog.window!!.setBackgroundDrawable(inset) + } catch (e: Exception) { + // do nothing + } + + try { + val layoutParams = episodeDialog.window!!.attributes + layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT + layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT + episodeDialog.window!!.setAttributes(layoutParams) + } catch (e: Exception) { + // do nothing + } + + episodeDialogBinding.close.setOnClickListener { episodeDialog.dismiss() } + } + + + private fun clickEvents() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() } + watchCard.setOnClickListener { + playTrailer.performClick() + } + likeSeason.setOnClickListener { - if (!isNetworkConnected()){ + if (!isNetworkConnected()) { toast(getString(R.string.no_internet)) return@setOnClickListener } categoryId?.let { - if (likeSeason.isSelected){ + if (likeSeason.isSelected) { WebSeriesRepository.likeUnLikeShow("${showData?.id}", false, it) - showData?.likes_count?.let {likeCountInt -> + showData?.likes_count?.let { likeCountInt -> likeCount.text = "${max(likeCountInt - 1, 0)}" } - }else{ + } else { WebSeriesRepository.likeUnLikeShow("${showData?.id}", true, it) - showData?.likes_count?.let {likeCountInt -> + showData?.likes_count?.let { likeCountInt -> val value = likeCountInt + 1 likeCount.text = "$value" } @@ -161,12 +223,13 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { likeSeason.isSelected = !likeSeason.isSelected setResult(RESULT_OK, Intent().apply { putExtra(EXTRA_SHOW_POSITION, showPosition) + putExtra(EXTRA_SHOW_CATEGORY_DATA, categoryId) }) } } favSeason.setOnClickListener { - if (!isNetworkConnected()){ + if (!isNetworkConnected()) { toast(getString(R.string.no_internet)) return@setOnClickListener } @@ -184,56 +247,100 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { setResult(RESULT_OK, Intent().apply { putExtra(EXTRA_SHOW_POSITION, showPosition) + putExtra(EXTRA_SHOW_CATEGORY_DATA, categoryId) }) } } + + playTrailer.setOnClickListener { + if (seasonsTab.selectedTabPosition >= 0) { + WebSeriesRepository.seasonDataMap["${showId}_${categoryId}"]?.result?.let { seasonList -> + if (seasonsTab.selectedTabPosition < seasonList.size) { + seasonList[seasonsTab.selectedTabPosition]?.season_more_details?.let {moreDetailsList -> + if (moreDetailsList.isNotEmpty()){ + val playlistItem = PlaylistItem.Builder() + + if (categoryId == "18" && moreDetailsList.size > 1){ + moreDetailsList[1]?.let {seasonData -> + playlistItem.title(seasonData.title) + playlistItem.image(seasonData.trailer_hd_url) + playlistItem.file(seasonData.trailer_hd_url) + } + }else{ + moreDetailsList[0]?.let {seasonData -> + playlistItem.title(seasonData.title) + playlistItem.image(seasonData.trailer_hd_url) + playlistItem.file(seasonData.trailer_hd_url) + } + } + + startActivity( + Intent(this@SeasonActivity, PlayerActivity::class.java) + .apply { + putParcelableArrayListExtra(EXTRA_PLAY_LIST, ArrayList().apply { + add(playlistItem.build()) + }) + } + ) + } + } + } + } + } + } } } - private fun setObservers(){ - WebSeriesRepository.seasonDataLiveData.observe(this){ + private fun setObservers() { + WebSeriesRepository.seasonDataLiveData.observe(this) { binding.seasonsTab.removeAllTabs() - when(it){ + when (it) { is ApiResult.Error -> { progressView.hide() } + is ApiResult.Loading -> { progressView.show() } + is ApiResult.Success -> { progressView.hide() - it.data?.result?.let {seasonList -> - for (season in seasonList){ + it.data?.result?.let { seasonList -> + for (season in seasonList) { if (season == null) continue - binding.seasonsTab.addTab(binding.seasonsTab.newTab().setText("${season.season_number}")) + binding.seasonsTab.addTab( + binding.seasonsTab.newTab().setText("${season.season_number}") + ) } } } } } - WebSeriesRepository.episodeDataLiveData.observe(this){ - when(it){ + WebSeriesRepository.episodeDataLiveData.observe(this) { + when (it) { is ApiResult.Error -> { binding.epShimmer.hide() binding.rvEpisodes.hide() binding.seasonMediaType.hide() } + is ApiResult.Loading -> { binding.epShimmer.show() binding.rvEpisodes.hide() binding.seasonMediaType.hide() } - is ApiResult.Success -> { - it.data?.result?.filterNotNull()?.let {episodeList -> - if (episodeList.isNotEmpty()){ - episodeAdapter.submitList(episodeList){ + is ApiResult.Success -> { + it.data?.result?.filterNotNull()?.let { episodeList -> + + if (episodeList.isNotEmpty()) { + episodeAdapter.submitList(episodeList) { binding.epShimmer.hide() binding.rvEpisodes.show() binding.seasonMediaType.show() } - }else{ + } else { binding.epShimmer.hide() binding.seasonMediaType.hide() binding.rvEpisodes.hide() @@ -243,25 +350,27 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { } } - WebSeriesRepository.teaserDataLiveData.observe(this){ - when(it){ + WebSeriesRepository.teaserDataLiveData.observe(this) { + when (it) { is ApiResult.Error -> { binding.rvTeaser.hide() binding.teaserTxt.hide() } + is ApiResult.Loading -> { binding.rvTeaser.hide() binding.teaserTxt.hide() } - is ApiResult.Success -> { - it.data?.result?.filterNotNull()?.let {episodeList -> - if (episodeList.isNotEmpty()){ - teaserAdapter.submitList(episodeList){ + is ApiResult.Success -> { + it.data?.result?.filterNotNull()?.let { episodeList -> + + if (episodeList.isNotEmpty()) { + teaserAdapter.submitList(episodeList) { binding.rvTeaser.show() binding.teaserTxt.show() } - }else{ + } else { binding.teaserTxt.hide() binding.rvTeaser.hide() } @@ -273,10 +382,10 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { private fun loadSeasonData() { binding.apply { - if (seasonsTab.selectedTabPosition >= 0){ - WebSeriesRepository.seasonDataMap["${showId}_${categoryId}"]?.result?.let {seasonList -> - if (seasonsTab.selectedTabPosition < seasonList.size){ - seasonList[seasonsTab.selectedTabPosition]?.let {seasonData -> + if (seasonsTab.selectedTabPosition >= 0) { + WebSeriesRepository.seasonDataMap["${showId}_${categoryId}"]?.result?.let { seasonList -> + if (seasonsTab.selectedTabPosition < seasonList.size) { + seasonList[seasonsTab.selectedTabPosition]?.let { seasonData -> // loading episode data seasonData.id?.let { @@ -285,8 +394,11 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { WebSeriesRepository.loadTeaserData(showId, it) } + + seasonYear.text = "${seasonData.release_year}" - val noOfEpisodes = "${seasonData.no_of_episodes} ${seasonData.media_type}" + val noOfEpisodes = + "${seasonData.no_of_episodes} ${seasonData.media_type}" episodeNumber.text = noOfEpisodes seasonMediaType.text = "${seasonData.media_type}" @@ -295,17 +407,27 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { image.loadImage(it) } - seasonData.season_more_details?.let {moreDetailsList -> - if (moreDetailsList.isNotEmpty()){ - if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ - moreDetailsList[1]?.let {moreDetails -> + seasonData.season_more_details?.let { moreDetailsList -> + if (moreDetailsList.isNotEmpty()) { + if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1) { + moreDetailsList[1]?.let { moreDetails -> seasonTitle.text = moreDetails.title?.uppercase() - seasonDescription.text = Html.fromHtml(moreDetails.description?.replace("
", " "), Html.FROM_HTML_MODE_LEGACY) + seasonDescription.text = Html.fromHtml( + moreDetails.description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) } - }else{ - moreDetailsList[0]?.let {moreDetails -> + } else { + moreDetailsList[0]?.let { moreDetails -> seasonTitle.text = moreDetails.title?.uppercase() - seasonDescription.text = Html.fromHtml(moreDetails.description?.replace("
", " "), Html.FROM_HTML_MODE_LEGACY) + seasonDescription.text = Html.fromHtml( + moreDetails.description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) } } } @@ -318,16 +440,148 @@ class SeasonActivity : AppCompatActivity(), OnTabSelectedListener { } } - private fun onEpisodeClicked(position: Int){ + private fun onEpisodeClicked(position: Int, episodeData: EpisodeData) { + episodeDialogBinding.apply { + episodeData.content_more_details?.let {moreDetailsList -> + + episodeData.thumbnail_path?.let { + image.loadImage(it) + } + + if (moreDetailsList.isNotEmpty()){ + + if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ + moreDetailsList[1]?.let {data -> + title.text = data.title + description.text = Html.fromHtml( + data.description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) + val mediaType = "${getString(R.string.episode)} ${episodeData.episode_number}" + mediaTypeNumber.text = mediaType + duration.text = episodeData.episode_duration + } + }else{ + moreDetailsList[0]?.let {data -> + title.text = data.title + description.text = Html.fromHtml( + data.description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) + val mediaType = "${getString(R.string.episode)} ${episodeData.episode_number}" + mediaTypeNumber.text = mediaType + duration.text = episodeData.episode_duration + } + } + }else{ + title.text = episodeData.episode_title + description.text = Html.fromHtml( + episodeData.episode_description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) + val mediaType = "${getString(R.string.episode)} ${episodeData.episode_number}" + mediaTypeNumber.text = mediaType + duration.text = episodeData.episode_duration + } + + watchCard.setOnClickListener { + onEpisodePlayClicked(position) + } + + close.setOnClickListener { + episodeDialog.dismiss() + } + + episodeDialog.show() + } + } + } + + private fun onEpisodePlayClicked(position: Int) { startActivity(Intent(this, PlayerActivity::class.java).apply { - putParcelableArrayListExtra(EXTRA_PLAY_LIST, WebSeriesRepository.episodesPlaylistMap["${showId}_${selectedSeasonId}_$categoryId"]) + putParcelableArrayListExtra( + EXTRA_PLAY_LIST, + WebSeriesRepository.episodesPlaylistMap["${showId}_${selectedSeasonId}_$categoryId"] + ) putExtra(EXTRA_EPISODE_INDEX, position) }) } - private fun onTeaserClicked(position: Int){ + private fun onTeaserClicked(position: Int, teaserData: TeaserData) { + episodeDialogBinding.apply { + teaserData.content_more_details?.let {moreDetailsList -> + + teaserData.thumbnail_path?.let { + image.loadImage(it) + } + + if (moreDetailsList.isNotEmpty()){ + + if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ + moreDetailsList[1]?.let {data -> + title.text = data.title + description.text = Html.fromHtml( + data.description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) + val mediaType = "${getString(R.string.teasers)} ${teaserData.teaser_number}" + mediaTypeNumber.text = mediaType + duration.text = teaserData.teaser_duration + } + }else{ + moreDetailsList[0]?.let {data -> + title.text = data.title + description.text = Html.fromHtml( + data.description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) + val mediaType = "${getString(R.string.teasers)} ${teaserData.teaser_number}" + mediaTypeNumber.text = mediaType + duration.text = teaserData.teaser_duration + } + } + }else{ + title.text = teaserData.teaser_title + description.text = Html.fromHtml( + teaserData.teaser_description?.replace( + "
", + " " + ), Html.FROM_HTML_MODE_LEGACY + ) + val mediaType = "${getString(R.string.teasers)} ${teaserData.teaser_number}" + mediaTypeNumber.text = mediaType + duration.text = teaserData.teaser_duration + } + + watchCard.setOnClickListener { + onTeaserPlayClicked(position) + } + + close.setOnClickListener { + episodeDialog.dismiss() + } + + episodeDialog.show() + } + } + } + + private fun onTeaserPlayClicked(position: Int) { startActivity(Intent(this, PlayerActivity::class.java).apply { - putParcelableArrayListExtra(EXTRA_PLAY_LIST, WebSeriesRepository.teasersPlaylistMap["${showId}_${selectedSeasonId}_$categoryId"]) + putParcelableArrayListExtra( + EXTRA_PLAY_LIST, + WebSeriesRepository.teasersPlaylistMap["${showId}_${selectedSeasonId}_$categoryId"] + ) putExtra(EXTRA_EPISODE_INDEX, position) }) } 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 981656f..07461e1 100644 --- a/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt +++ b/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt @@ -1,8 +1,13 @@ package com.woka.webseries.views +import android.app.Dialog import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.InsetDrawable import android.os.Bundle import android.view.View +import android.view.WindowManager import android.widget.AdapterView import android.widget.AdapterView.OnItemSelectedListener import androidx.activity.enableEdgeToEdge @@ -16,6 +21,8 @@ import androidx.recyclerview.widget.SimpleItemAnimator import com.google.android.material.appbar.CollapsingToolbarLayout import com.woka.R import com.woka.databinding.ActivityWebSeriesBinding +import com.woka.databinding.DialogBlogsBinding +import com.woka.databinding.DialogEpisodeBinding import com.woka.modules.ModuleRepository import com.woka.networking.ApiResult import com.woka.utils.WokaBaseActivity @@ -90,7 +97,6 @@ class WebSeriesActivity : WokaBaseActivity(), Observer - if (position > -1){ + if (position > -1 && position < showAdapter.itemCount){ showAdapter.notifyItemChanged(position) } } @@ -136,7 +142,12 @@ class WebSeriesActivity : WokaBaseActivity(), Observer {} is ApiResult.Success -> { it.data?.result?.let {continueWatchList -> - continueWatchAdapter.submitList(continueWatchList) + if (continueWatchList.isNotEmpty()){ + binding.rvContinueWatch.show() + continueWatchAdapter.submitList(continueWatchList.asReversed()) + }else{ + binding.rvContinueWatch.hide() + } } } } diff --git a/app/src/main/res/layout/activity_season.xml b/app/src/main/res/layout/activity_season.xml index 6956159..dd0d269 100644 --- a/app/src/main/res/layout/activity_season.xml +++ b/app/src/main/res/layout/activity_season.xml @@ -200,38 +200,30 @@ /> - + android:background="@drawable/round_bg_25" + android:backgroundTint="#5E1FC4" -