From 9db563e2cdf1c51924533a47eb2698f889c6ce43 Mon Sep 17 00:00:00 2001 From: AdityaGaikwad Date: Wed, 26 Jun 2024 21:02:54 +0530 Subject: [PATCH] Episode Dialog when clicked onn teaser and episode in SeasonActivity : Ui and functionality Playing trailer of every season according to the category chosen Solving issues in cache syncing for webshow's fav data Hindi strings updates opening SeasonActivity when clicked on webshows on MyListFragment like synching and boookmark syncing in MyListFragment --- .../com/woka/home/fragments/MyListFragment.kt | 45 +++ .../com/woka/home/mylist/MyListRepository.kt | 84 ++-- .../home/mylist/adapters/WebSeriesAdapter.kt | 35 +- .../home/mylist/models/BookmarkedShowData.kt | 26 +- .../woka/players/LiveStreamPlayerActivity.kt | 3 +- .../java/com/woka/players/PlayerActivity.kt | 3 +- .../com/woka/webseries/WebSeriesRepository.kt | 10 +- .../adapters/ContinueEpisodeAdapter.kt | 18 +- .../woka/webseries/adapters/EpisodeAdapter.kt | 11 +- .../woka/webseries/adapters/TeaserAdapter.kt | 13 +- .../adapters/WebSeriesShowAdapter.kt | 13 +- .../com/woka/webseries/models/ShowData.kt | 38 +- .../woka/webseries/views/SeasonActivity.kt | 358 +++++++++++++++--- .../woka/webseries/views/WebSeriesActivity.kt | 17 +- app/src/main/res/layout/activity_season.xml | 34 +- .../res/layout/continue_show_view_holder.xml | 2 +- app/src/main/res/layout/dialog_episode.xml | 152 ++++++++ app/src/main/res/layout/fav_view_holder.xml | 1 + app/src/main/res/values-hi/strings.xml | 14 + app/src/main/res/values/strings.xml | 15 +- 20 files changed, 721 insertions(+), 171 deletions(-) create mode 100644 app/src/main/res/layout/dialog_episode.xml 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" -