diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 0897082..d12ae9e 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -15,5 +15,6 @@
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index fdf8d99..6d0ee1c 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index bcab98a..39c598b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,6 +3,7 @@ plugins {
alias(libs.plugins.jetbrainsKotlinAndroid)
id("kotlin-parcelize")
alias(libs.plugins.navigationSafeArgs)
+ alias(libs.plugins.ksp)
}
android {
@@ -114,6 +115,14 @@ dependencies {
// audio mixer for karaoke
implementation("com.github.ZeroOneZeroR:android_audio_mixer:v1.1")
+ // room-database
+ def room_version = "2.6.1"
+ implementation(libs.androidx.room.runtime)
+ ksp("androidx.room:room-compiler:$room_version")
+
+ // optional - Kotlin Extensions and Coroutines support for Room
+ implementation(libs.room.ktx)
+
implementation libs.androidx.core.ktx
implementation libs.androidx.appcompat
implementation libs.material
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a53eff0..65b1dc8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,11 +17,14 @@
android:supportsRtl="true"
android:theme="@style/Theme.Woka"
tools:targetApi="31">
+
+ android:windowSoftInputMode="adjustPan" />
): ListAdapter(config) {
+class NotificationAdapter: ListAdapter(DIFF_CONFIG) {
companion object{
private val DIFF_UTIL = object : DiffUtil.ItemCallback(){
@@ -33,10 +33,10 @@ class NotificationAdapter(config: AsyncDifferConfig): ListAdap
.build()
}
- constructor(): this(DIFF_CONFIG)
-
inner class NotificationViewHolder(val binding: NotificationViewHolderBinding): ViewHolder(binding.root)
+ var clickListener: ((Int) -> Unit)? = null
+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotificationViewHolder {
return NotificationViewHolder(
NotificationViewHolderBinding.inflate(
@@ -65,5 +65,11 @@ class NotificationAdapter(config: AsyncDifferConfig): ListAdap
}
holder.binding.bodyTxt.text = notification.title
+
+ holder.binding.root.setOnClickListener {
+ notification.post_type?.let {
+ clickListener?.invoke(it)
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/woka/home/notifications/NotificationsActivity.kt b/app/src/main/java/com/woka/home/notifications/NotificationsActivity.kt
index cd4e5cd..66fbe32 100644
--- a/app/src/main/java/com/woka/home/notifications/NotificationsActivity.kt
+++ b/app/src/main/java/com/woka/home/notifications/NotificationsActivity.kt
@@ -1,15 +1,21 @@
package com.woka.home.notifications
+import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.woka.R
+import com.woka.audiobooks.views.AudioBooksActivity
import com.woka.databinding.ActivityNotificationsBinding
+import com.woka.karaoke.views.KaraokeActivity
import com.woka.networking.ApiResult
+import com.woka.shop.views.ShopActivity
import com.woka.utils.WokaBaseActivity
import com.woka.utils.hide
import com.woka.utils.show
+import com.woka.webseries.views.WebSeriesActivity
+import com.woka.wokagames.views.GamesActivity
class NotificationsActivity : WokaBaseActivity() {
@@ -55,6 +61,23 @@ class NotificationsActivity : WokaBaseActivity() {
backBtn.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
+
+ adapter.clickListener = {
+ when (it){
+ in 1..4 -> {
+ WebSeriesActivity::class.java
+ }
+ in 6..6 -> GamesActivity::class.java
+ in 7..7 -> AudioBooksActivity::class.java
+ in 8..8 -> KaraokeActivity::class.java
+ in 9..9 -> ShopActivity::class.java
+ else -> {null}
+ }?.let {destination ->
+ startActivity(Intent(
+ this@NotificationsActivity, destination
+ ))
+ }
+ }
}
}
diff --git a/app/src/main/java/com/woka/home/viewmodels/FMViewModel.kt b/app/src/main/java/com/woka/home/viewmodels/FMViewModel.kt
deleted file mode 100644
index baaaa8e..0000000
--- a/app/src/main/java/com/woka/home/viewmodels/FMViewModel.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.woka.home.viewmodels
-
-import androidx.lifecycle.ViewModel
-
-class FMViewModel: ViewModel() {
-
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/woka/home/views/ExploreWokaActivity.kt b/app/src/main/java/com/woka/home/views/ExploreWokaActivity.kt
index 9aff2ca..5284eba 100644
--- a/app/src/main/java/com/woka/home/views/ExploreWokaActivity.kt
+++ b/app/src/main/java/com/woka/home/views/ExploreWokaActivity.kt
@@ -13,7 +13,9 @@ import com.woka.R
import com.woka.audiobooks.views.AudioBooksActivity
import com.woka.databinding.ActivityExploreWokaBinding
import com.woka.karaoke.views.KaraokeActivity
+import com.woka.modules.blogs.view.BlogsActivity
import com.woka.players.views.LiveStreamPlayerActivity
+import com.woka.shop.views.ShopActivity
import com.woka.utils.WokaBaseActivity
import com.woka.utils.lightStatusBar
import com.woka.webseries.views.WebSeriesActivity
@@ -81,6 +83,14 @@ class ExploreWokaActivity : WokaBaseActivity() {
startActivity(Intent(this@ExploreWokaActivity, KaraokeActivity::class.java))
}
+ blogs.setOnClickListener {
+ startActivity(Intent(this@ExploreWokaActivity, BlogsActivity::class.java))
+ }
+
+ shop.setOnClickListener {
+ startActivity(Intent(this@ExploreWokaActivity, ShopActivity::class.java))
+ }
+
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/woka/home/views/HomeActivity.kt b/app/src/main/java/com/woka/home/views/HomeActivity.kt
index cc3adcc..061dfca 100644
--- a/app/src/main/java/com/woka/home/views/HomeActivity.kt
+++ b/app/src/main/java/com/woka/home/views/HomeActivity.kt
@@ -562,7 +562,7 @@ class HomeActivity : WokaBaseActivity(),
value.data?.result?.let {
binding.apply {
- it.avtar?.let {
+ it.avtar_url?.let {
Glide.with(this@HomeActivity)
.load(it)
.placeholder(R.drawable.profile_placeholder)
diff --git a/app/src/main/java/com/woka/home/views/MoreHomeActivity.kt b/app/src/main/java/com/woka/home/views/MoreHomeActivity.kt
index b445ba4..40ed07c 100644
--- a/app/src/main/java/com/woka/home/views/MoreHomeActivity.kt
+++ b/app/src/main/java/com/woka/home/views/MoreHomeActivity.kt
@@ -13,7 +13,6 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.media3.common.MediaItem
import androidx.recyclerview.widget.SimpleItemAnimator
-import com.bumptech.glide.Glide
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.ActivityMoreHomeBinding
@@ -216,11 +215,7 @@ class MoreHomeActivity : WokaBaseActivity() {
scrollView.smoothScrollTo(0, 0)
blog.thumbnail_path?.let {
- Glide.with(this@MoreHomeActivity)
- .load(it)
- .placeholder(android.R.color.darker_gray)
- .error(android.R.color.darker_gray)
- .into(blogImage)
+ blogImage.loadImage(it)
}
var titleTxt = blog.title
diff --git a/app/src/main/java/com/woka/modules/blogs/BlogsAdapter.kt b/app/src/main/java/com/woka/modules/blogs/BlogsAdapter.kt
index 2243370..65b6bd1 100644
--- a/app/src/main/java/com/woka/modules/blogs/BlogsAdapter.kt
+++ b/app/src/main/java/com/woka/modules/blogs/BlogsAdapter.kt
@@ -12,8 +12,8 @@ import com.woka.modules.blogs.models.Blog
import java.util.concurrent.Executors
import kotlin.reflect.KFunction1
-class BlogsAdapter(private val onBlogClicked: KFunction1, config: AsyncDifferConfig) :
- ListAdapter(config) {
+class BlogsAdapter(private val onBlogClicked: KFunction1, isGridView: Boolean = false) :
+ ListAdapter(ASYNC_DIFF_CONFIG) {
inner class BlogViewHolder(val binding: BlogViewHolderBinding): ViewHolder(binding.root)
@@ -31,8 +31,6 @@ class BlogsAdapter(private val onBlogClicked: KFunction1, config: As
.build()
}
- constructor(onBlogClicked: KFunction1): this(onBlogClicked, ASYNC_DIFF_CONFIG)
-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BlogViewHolder {
return BlogViewHolder(BlogViewHolderBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
diff --git a/app/src/main/java/com/woka/modules/blogs/BlogsGridAdapter.kt b/app/src/main/java/com/woka/modules/blogs/BlogsGridAdapter.kt
new file mode 100644
index 0000000..652e4c1
--- /dev/null
+++ b/app/src/main/java/com/woka/modules/blogs/BlogsGridAdapter.kt
@@ -0,0 +1,67 @@
+package com.woka.modules.blogs
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.AsyncDifferConfig
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView.ViewHolder
+import com.woka.WokaApp
+import com.woka.databinding.BlogViewHolderBinding
+import com.woka.databinding.BlogViewHolderGridBinding
+import com.woka.modules.blogs.models.Blog
+import java.util.concurrent.Executors
+import kotlin.reflect.KFunction1
+
+class BlogsGridAdapter(private val onBlogClicked: KFunction1, isGridView: Boolean = false) :
+ ListAdapter(ASYNC_DIFF_CONFIG) {
+
+ inner class BlogViewHolder(val binding: BlogViewHolderGridBinding): ViewHolder(binding.root)
+
+ companion object{
+ private val DIFF_UTILS = object : DiffUtil.ItemCallback(){
+ override fun areItemsTheSame(oldItem: Blog, newItem: Blog): Boolean =
+ oldItem.id == newItem.id
+
+ override fun areContentsTheSame(oldItem: Blog, newItem: Blog): Boolean =
+ oldItem == newItem
+ }
+
+ private val ASYNC_DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTILS)
+ .setBackgroundThreadExecutor(Executors.newSingleThreadExecutor())
+ .build()
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BlogViewHolder {
+ return BlogViewHolder(BlogViewHolderGridBinding.inflate(LayoutInflater.from(parent.context), parent, false))
+ }
+
+ override fun onBindViewHolder(holder: BlogViewHolder, position: Int) {
+ val blog = getItem(holder.absoluteAdapterPosition)
+
+ holder.binding.apply {
+
+ blog.thumbnail_path?.let {
+ image.loadImage(it)
+ }
+
+ card.setOnClickListener {
+ onBlogClicked(blog)
+ }
+
+ var titleTxt = blog.title
+
+ blog.content_more_details?.let {
+ if (it.isNotEmpty()){
+ titleTxt = it[0]?.title
+
+ if (it.size > 1 && WokaApp.userPrefs?.appLanguage == "hi"){
+ titleTxt = it[1]?.title
+ }
+ }
+ }
+
+ title.text = titleTxt
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/woka/modules/blogs/BlogsRepository.kt b/app/src/main/java/com/woka/modules/blogs/BlogsRepository.kt
index e9e4d79..d90d240 100644
--- a/app/src/main/java/com/woka/modules/blogs/BlogsRepository.kt
+++ b/app/src/main/java/com/woka/modules/blogs/BlogsRepository.kt
@@ -29,7 +29,7 @@ object BlogsRepository{
}
}
- private fun loadBlogs(){
+ fun loadBlogs(){
CoroutineScope(Dispatchers.IO).launch {
_blogsLiveData.postValue(ApiResult.Loading())
_blogsLiveData.postValue(getBlogs())
diff --git a/app/src/main/java/com/woka/modules/blogs/view/BlogsActivity.kt b/app/src/main/java/com/woka/modules/blogs/view/BlogsActivity.kt
new file mode 100644
index 0000000..4e57042
--- /dev/null
+++ b/app/src/main/java/com/woka/modules/blogs/view/BlogsActivity.kt
@@ -0,0 +1,162 @@
+package com.woka.modules.blogs.view
+
+import android.app.Dialog
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.InsetDrawable
+import android.os.Bundle
+import android.text.Html
+import android.view.WindowManager
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import com.woka.R
+import com.woka.WokaApp
+import com.woka.databinding.ActivityBlogsBinding
+import com.woka.databinding.DialogBlogsBinding
+import com.woka.modules.blogs.BlogsGridAdapter
+import com.woka.modules.blogs.BlogsRepository
+import com.woka.modules.blogs.models.Blog
+import com.woka.networking.ApiResult
+import com.woka.utils.hide
+import com.woka.utils.show
+
+class BlogsActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityBlogsBinding
+ private lateinit var adapter: BlogsGridAdapter
+
+ private lateinit var blogBinding: DialogBlogsBinding
+ private lateinit var blogDialog: Dialog
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ binding = ActivityBlogsBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
+ val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+ insets
+ }
+
+ window.navigationBarColor = getColor(R.color.color_primary)
+
+ adapter = BlogsGridAdapter(::obBlogClicked)
+
+ initViews()
+
+ clickEvents()
+
+ initBlogDialog()
+
+ setObservers()
+ }
+
+ private fun initViews(){
+ binding.apply {
+ toolbar.title.text = getString(R.string.blogs)
+ rvBlogs.adapter = adapter
+ }
+ }
+
+ private fun clickEvents(){
+ binding.apply {
+ retryBtn.setOnClickListener {
+ BlogsRepository.loadBlogs()
+ }
+
+ toolbar.backBtn.setOnClickListener {
+ onBackPressedDispatcher.onBackPressed()
+ }
+ }
+ }
+
+ private fun initBlogDialog(){
+ blogBinding = DialogBlogsBinding.inflate(layoutInflater)
+ blogDialog = Dialog(this)
+
+ blogDialog.setContentView(blogBinding.root)
+
+ try {
+ val back = ColorDrawable(Color.TRANSPARENT)
+ val inset = InsetDrawable(back, 50)
+ blogDialog.window!!.setBackgroundDrawable(inset)
+ } catch (e: Exception) {
+ // do nothing
+ }
+
+ try {
+ val layoutParams = blogDialog.window!!.attributes
+ layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT
+ layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT
+ blogDialog.window!!.setAttributes(layoutParams)
+ } catch (e: Exception) {
+ // do nothing
+ }
+
+ blogBinding.close.setOnClickListener { blogDialog.dismiss() }
+ }
+
+ private fun obBlogClicked(blog: Blog){
+ blogBinding.apply {
+
+ scrollView.smoothScrollTo(0, 0)
+
+ blog.thumbnail_path?.let {
+ blogImage.loadImage(it)
+ }
+
+ var titleTxt = blog.title
+ var descriptionTxt = blog.description
+
+ blog.content_more_details?.let {
+ if (it.isNotEmpty()){
+ titleTxt = it[0]?.title
+ descriptionTxt = it[0]?.article
+
+ if (it.size > 1 && WokaApp.userPrefs?.appLanguage == "hi"){
+ titleTxt = it[1]?.title
+ descriptionTxt = it[1]?.article
+ }
+ }
+ }
+
+ blogTitle.text = titleTxt
+ blogDescription.text = Html.fromHtml(descriptionTxt, Html.FROM_HTML_MODE_LEGACY)
+
+ }
+
+ blogDialog.show()
+ }
+
+ private fun setObservers(){
+ BlogsRepository.blogsLiveData.observe(this){
+ binding.apply {
+ when (it){
+ is ApiResult.Error -> {
+ shimmer.hide()
+ rvBlogs.hide()
+ noData.show()
+ }
+ is ApiResult.Loading -> {
+ shimmer.show()
+ rvBlogs.hide()
+ noData.hide()
+ }
+ is ApiResult.Success -> {
+ it.data?.blogs?.filterNotNull()?.let {
+ adapter.submitList(it){
+ shimmer.hide()
+ noData.hide()
+ rvBlogs.show()
+ }
+ }
+ }
+ null -> {}
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/woka/userdata/userDataModels/UserData.kt b/app/src/main/java/com/woka/userdata/userDataModels/UserData.kt
index 61972ac..6ae94f1 100644
--- a/app/src/main/java/com/woka/userdata/userDataModels/UserData.kt
+++ b/app/src/main/java/com/woka/userdata/userDataModels/UserData.kt
@@ -4,11 +4,12 @@ data class UserData(
val already_logged_in: Boolean,
val is_deactive: Boolean,
val avtar: String?,
+ val avtar_url: String?,
+ val gender_data: Gender?,
val birthdate: String?,
val child_detail: ChildDetail?,
val email: String?,
val fullname: String?,
-// val gender: Gender?,
val id: Int?,
val is_active: String?,
val language: Language?,
diff --git a/app/src/main/java/com/woka/webseries/viewmodel/WebSeriesViewModel.kt b/app/src/main/java/com/woka/webseries/viewmodel/WebSeriesViewModel.kt
index 4c40224..a3afedb 100644
--- a/app/src/main/java/com/woka/webseries/viewmodel/WebSeriesViewModel.kt
+++ b/app/src/main/java/com/woka/webseries/viewmodel/WebSeriesViewModel.kt
@@ -18,9 +18,13 @@ import com.woka.webseries.models.teaserdata.TeaserData
import kotlinx.coroutines.launch
class WebSeriesViewModel : ViewModel() {
-
private val repository = WebSeriesRepository
+ // callbacks
+ var onShowDataChanged: ((ShowData, String) -> Unit)? = null
+ var isTrailerExpanded: Boolean = true
+ var selectedCategoryPos: Int = 0
+
// categories listing
private val _showCategoryLiveData = MutableLiveData>()
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 6027fa6..040c58e 100644
--- a/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt
+++ b/app/src/main/java/com/woka/webseries/views/WebSeriesActivity.kt
@@ -4,12 +4,13 @@ import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
+import androidx.navigation.NavOptions
+import androidx.navigation.fragment.NavHostFragment
import com.woka.R
import com.woka.databinding.ActivityWebSeriesBinding
import com.woka.utils.WokaBaseActivity
import com.woka.webseries.models.ShowData
-import com.woka.webseries.views.fragments.WebSeriesFragment
-import com.woka.webseries.views.fragments.WebShowFragment
+import com.woka.webseries.views.fragments.WebSeriesFragmentDirections
class WebSeriesActivity : WokaBaseActivity() {
@@ -38,14 +39,11 @@ class WebSeriesActivity : WokaBaseActivity() {
val showData = intent.getParcelableExtra(EXTRA_SHOW_DATA)
val categoryId = intent.getStringExtra(EXTRA_SHOW_CATEGORY)
- supportFragmentManager.beginTransaction()
- .add(
- R.id.fcv_web_series, if (showData != null && categoryId != null) {
- WebShowFragment.newInstance(showData, categoryId)
- } else {
- WebSeriesFragment.newInstance()
- }
- )
- .commit()
+ if (showData != null && categoryId != null) {
+ val navHost = supportFragmentManager.findFragmentById(R.id.fc_web_series) as NavHostFragment
+ navHost.navController.navigate(WebSeriesFragmentDirections.actionWebSeriesFragment2ToWebShowFragment(
+ showData, categoryId
+ ), NavOptions.Builder().setPopUpTo(R.id.webSeriesFragment2, true).build())
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt b/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt
index 067beba..655b4d3 100644
--- a/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt
+++ b/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt
@@ -15,6 +15,7 @@ import android.widget.AdapterView
import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
+import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.SimpleItemAnimator
import com.google.android.material.appbar.CollapsingToolbarLayout
import com.jwplayer.pub.api.media.playlists.PlaylistItem
@@ -41,16 +42,14 @@ import com.woka.webseries.models.ContinueEpisodeData
import com.woka.webseries.models.ShowData
import com.woka.webseries.viewmodel.WebSeriesViewModel
-class WebSeriesFragment private constructor(): Fragment() {
+class WebSeriesFragment : Fragment() {
private lateinit var binding: FragmentWebSeriesBinding
- private var viewModel: WebSeriesViewModel? = null
+ private lateinit var viewModel: WebSeriesViewModel
private lateinit var showAdapter: WebSeriesShowAdapter
-
private lateinit var continueWatchAdapter: ContinueEpisodeAdapter
-
- private var catSpinnerAdapter: SpinnerAdapter? = null
+ private lateinit var catSpinnerAdapter: SpinnerAdapter
private lateinit var episodeDialogBinding: DialogContinueEpisodeBinding
private lateinit var episodeDialog: Dialog
@@ -59,20 +58,21 @@ class WebSeriesFragment private constructor(): Fragment() {
private lateinit var noSignInDialog: NoSignInDialog
- companion object {
- fun newInstance() = WebSeriesFragment()
- }
-
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentWebSeriesBinding.inflate(inflater, container, false)
+ viewModel = ViewModelProvider(requireActivity())[WebSeriesViewModel::class.java]
activity?.let {
- it.window.setBackgroundDrawable(AppCompatResources.getDrawable(it, R.drawable.gradient_web_series))
+ it.window.setBackgroundDrawable(
+ AppCompatResources.getDrawable(
+ it,
+ R.drawable.gradient_web_series
+ )
+ )
it.window.statusBarColor = 0
it.window.lightStatusBar(false)
- viewModel = ViewModelProvider(it)[WebSeriesViewModel::class.java]
}
return binding.root
}
@@ -82,6 +82,11 @@ class WebSeriesFragment private constructor(): Fragment() {
noSignInDialog = NoSignInDialog(requireContext())
+ showAdapter = WebSeriesShowAdapter(requireContext(), ::onShowClicked, ::onShowCommonDataChange) {
+ noSignInDialog.show()
+ }
+ continueWatchAdapter = ContinueEpisodeAdapter(requireContext())
+
initViews()
initEpisodeDialog()
@@ -90,8 +95,8 @@ class WebSeriesFragment private constructor(): Fragment() {
setObservers()
- if (viewModel?.showCategoryLiveData?.isInitialized == false){
- viewModel?.loadCategories()
+ if (!viewModel.showCategoryLiveData.isInitialized) {
+ viewModel.loadCategories()
}
}
@@ -105,19 +110,19 @@ class WebSeriesFragment private constructor(): Fragment() {
binding.shimmer.show()
binding.errorView.hide()
- viewModel?.loadCategories()
+ viewModel.loadCategories()
}
loadMoreBtn.setOnClickListener {
- catSpinnerAdapter?.selectedCategoryType?.let {
+ catSpinnerAdapter.selectedCategoryType?.let {
loadingMore = true
- viewModel?.loadMoreWebSeries(it)
+ viewModel.loadMoreWebSeries(it)
}
}
trailerBtn.setOnClickListener {
- activity?.let {
- it.startActivity(Intent(it, PlayerActivity::class.java).apply {
+ activity.let {
+ it?.startActivity(Intent(it, PlayerActivity::class.java).apply {
putExtra(
EXTRA_PLAY_LIST,
VideoPlayList(
@@ -139,19 +144,17 @@ class WebSeriesFragment private constructor(): Fragment() {
}
}
}
- private fun initViews(){
- // adapters
- activity?.let {
- showAdapter = WebSeriesShowAdapter(it, ::onShowClicked, ::onShowCommonDataChange){
- noSignInDialog.show()
- }
- continueWatchAdapter = ContinueEpisodeAdapter(it)
- }
+ private fun initViews() {
+
+ // receiving callbacks
+ viewModel.onShowDataChanged = ::onShowDataChanged
binding.apply {
adjustMasilaImage()
+ binding.trailerView.setExpanded(viewModel.isTrailerExpanded)
+
toolbar.title.text = getString(R.string.web_series)
rvWebSeries.adapter = showAdapter
@@ -175,7 +178,7 @@ class WebSeriesFragment private constructor(): Fragment() {
}
}
- private fun initEpisodeDialog(){
+ private fun initEpisodeDialog() {
episodeDialogBinding = DialogContinueEpisodeBinding.inflate(layoutInflater)
episodeDialog = Dialog(requireContext())
@@ -202,23 +205,24 @@ class WebSeriesFragment private constructor(): Fragment() {
episodeDialogBinding.close.setOnClickListener { episodeDialog.dismiss() }
}
- private fun loadShowData(){
- catSpinnerAdapter?.selectedCategoryType?.let {
+ private fun loadShowData() {
+ catSpinnerAdapter.selectedCategoryType?.let {
loadingMore = false
- viewModel?.loadWebSeries(it)
+ viewModel.loadWebSeries(it)
}
}
- private fun setObservers(){
- viewModel?.showCategoryLiveData?.observe(viewLifecycleOwner){
- when(it){
+ private fun setObservers() {
+ viewModel.showCategoryLiveData.observe(viewLifecycleOwner) {
+ when (it) {
is ApiResult.Error -> {
binding.errorView.show()
binding.shimmer.hide()
}
+
is ApiResult.Loading -> {}
is ApiResult.Success -> {
- it.data?.result?.let {catList ->
+ it.data?.result?.let { catList ->
binding.shimmer.hide()
binding.trailerView.show()
@@ -228,34 +232,34 @@ class WebSeriesFragment private constructor(): Fragment() {
binding.spinnerCard.show()
binding.selectLangTxt.show()
- activity?.let {activity ->
- catSpinnerAdapter = SpinnerAdapter(activity, catList.filterNotNull())
- binding.categorySpinner.setAdapter(catSpinnerAdapter)
+ catSpinnerAdapter = SpinnerAdapter(requireContext(), catList.filterNotNull())
+ binding.categorySpinner.setAdapter(catSpinnerAdapter)
+ binding.categorySpinner.setSelection(viewModel.selectedCategoryPos)
- loadShowData()
- if (userPrefs?.userType != UserType.GUEST && viewModel?.continueWatchLiveData?.isInitialized == false){
- viewModel?.loadContinueWatching()
- }
+ loadShowData()
+ if (userPrefs?.userType != UserType.GUEST && !viewModel.continueWatchLiveData.isInitialized) {
+ viewModel.loadContinueWatching()
}
}
}
}
}
- viewModel?.continueWatchLiveData?.observe(viewLifecycleOwner){
- when (it){
+ viewModel.continueWatchLiveData.observe(viewLifecycleOwner) {
+ when (it) {
is ApiResult.Error -> {
binding.rvContinueWatch.hide()
binding.continueWatchTxt.hide()
}
+
is ApiResult.Loading -> {}
is ApiResult.Success -> {
- it.data?.result?.let {continueWatchList ->
- if (continueWatchList.isNotEmpty()){
+ it.data?.result?.let { continueWatchList ->
+ if (continueWatchList.isNotEmpty()) {
binding.rvContinueWatch.show()
binding.continueWatchTxt.show()
- continueWatchAdapter.submitList(continueWatchList.asReversed())
- }else{
+ continueWatchAdapter.submitList(continueWatchList.reversed())
+ } else {
binding.rvContinueWatch.hide()
binding.continueWatchTxt.hide()
}
@@ -264,43 +268,47 @@ class WebSeriesFragment private constructor(): Fragment() {
}
}
- viewModel?.webSeriesLiveData?.observe(viewLifecycleOwner){
- when (it){
+ viewModel.webSeriesLiveData.observe(viewLifecycleOwner) {
+ when (it) {
is ApiResult.Error -> {
binding.shimmerShowData.hide()
- if (loadingMore){
+ if (loadingMore) {
// load more
binding.loadMoreBtn.text = getString(R.string.retry)
binding.loadMoreBtn.show()
- }else{
+ } else {
// first time load
binding.rvWebSeries.hide()
binding.shimmerShowData.hide()
binding.loadMoreBtn.hide()
}
}
+
is ApiResult.Loading -> {
binding.shimmerShowData.show()
binding.loadMoreBtn.hide()
binding.rvWebSeries.setVisibility(loadingMore)
}
+
is ApiResult.Success -> {
- catSpinnerAdapter?.selectedCategoryType?.let { categoryType ->
- it.data?.let {showList ->
+ catSpinnerAdapter.selectedCategoryType?.let { categoryType ->
+ it.data?.let { showList ->
binding.rvWebSeries.show()
binding.shimmerShowData.hide()
binding.loadMoreBtn.text = getString(R.string.load_more)
- binding.loadMoreBtn.setVisibility(viewModel?.categoryPagingData?.get(categoryType)?.lastPage == false)
+ binding.loadMoreBtn.setVisibility(
+ viewModel.categoryPagingData[categoryType]?.lastPage == false
+ )
- if (loadingMore){
+ if (loadingMore) {
// loaded more data
showAdapter.notifyItemRangeInserted(
showAdapter.showList.size,
showList.size
)
- }else{
+ } else {
// new category data load
showAdapter.submitListShowList(showList, categoryType)
}
@@ -318,36 +326,42 @@ class WebSeriesFragment private constructor(): Fragment() {
position: Int,
id: Long
) {
- if (position != catSpinnerAdapter?.currentSelection){
- catSpinnerAdapter?.let {
+ if (position != catSpinnerAdapter.currentSelection) {
+ catSpinnerAdapter.let {
it.selectPosition(position)
loadShowData()
}
}
+
+ viewModel.selectedCategoryPos = position
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
+
+ binding.trailerView.addOnOffsetChangedListener { _, offset ->
+ viewModel.isTrailerExpanded = offset == 0
+ }
}
- private fun onShowClicked(showData: ShowData, categoryId: String){
- parentFragmentManager.beginTransaction()
- .add(R.id.fcv_web_series, WebShowFragment.newInstance(showData, categoryId, ::onShowDataChanged))
- .hide(this)
- .addToBackStack(null)
- .commit()
+ private fun onShowClicked(showData: ShowData, categoryId: String) {
+ findNavController().navigate(
+ WebSeriesFragmentDirections.actionWebSeriesFragment2ToWebShowFragment(
+ showData, categoryId
+ )
+ )
}
// updating common data of shows across all category show list
- private fun onShowCommonDataChange(showData: ShowData, categoryId: String){
+ private fun onShowCommonDataChange(showData: ShowData, categoryId: String) {
// changing in viewmodel data
- viewModel?.showCommonDataChanged(showData, categoryId)
+ viewModel.showCommonDataChanged(showData, categoryId)
}
private fun onShowDataChanged(showData: ShowData, categoryId: String) {
- viewModel?.showCommonDataChanged(showData, categoryId)
+ viewModel.showCommonDataChanged(showData, categoryId)
val position = showAdapter.showList.indexOfFirst { it.id == showData.id }
- if (position >= 0 && position < showAdapter.showList.size){
+ if (position >= 0 && position < showAdapter.showList.size) {
val currData = showAdapter.showList[position]
currData.is_liked = showData.is_liked
@@ -358,18 +372,18 @@ class WebSeriesFragment private constructor(): Fragment() {
}
}
- private fun onContinueEpisodeClicked(episodeData: ContinueEpisodeData){
+ private fun onContinueEpisodeClicked(episodeData: ContinueEpisodeData) {
episodeDialogBinding.apply {
- episodeData.content_more_details?.let {moreDetailsList ->
+ episodeData.content_more_details?.let { moreDetailsList ->
- episodeData.thumbnail_path?.let {
+ episodeData.thumbnail_path.let {
image.loadImage(it)
}
- if (moreDetailsList.isNotEmpty()){
+ if (moreDetailsList.isNotEmpty()) {
- if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){
- moreDetailsList[1].let {data ->
+ if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1) {
+ moreDetailsList[1].let { data ->
title.text = data.title
description.text = Html.fromHtml(
data.description?.replace(
@@ -378,8 +392,8 @@ class WebSeriesFragment private constructor(): Fragment() {
), Html.FROM_HTML_MODE_LEGACY
)
}
- }else{
- moreDetailsList[0].let {data ->
+ } else {
+ moreDetailsList[0].let { data ->
title.text = data.title
description.text = Html.fromHtml(
data.description?.replace(
@@ -389,7 +403,7 @@ class WebSeriesFragment private constructor(): Fragment() {
)
}
}
- }else{
+ } else {
title.text = episodeData.episode_title
description.text = Html.fromHtml(
episodeData.episode_description?.replace(
@@ -400,11 +414,11 @@ class WebSeriesFragment private constructor(): Fragment() {
}
watchCard.setOnClickListener {
- episodeData.content_more_details.let {moreDetailsList ->
+ episodeData.content_more_details.let { moreDetailsList ->
val videoPlayList = VideoPlayList(ArrayList(), ArrayList())
- if (moreDetailsList.isNotEmpty()){
- if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){
+ if (moreDetailsList.isNotEmpty()) {
+ if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1) {
videoPlayList.playlist.add(
PlaylistItem.Builder()
.file(moreDetailsList[1].content_hd_url)
@@ -421,7 +435,7 @@ class WebSeriesFragment private constructor(): Fragment() {
category_id = "18"
)
)
- }else{
+ } else {
videoPlayList.playlist.add(
PlaylistItem.Builder()
.file(moreDetailsList[0].content_hd_url)
@@ -441,13 +455,11 @@ class WebSeriesFragment private constructor(): Fragment() {
}
}
- activity?.let {
- startActivity(Intent(it, PlayerActivity::class.java)
- .apply {
- putExtra(EXTRA_PLAY_LIST, videoPlayList)
- putExtra(EXTRA_PLAY_INDEX, 0)
- })
- }
+ startActivity(Intent(activity, PlayerActivity::class.java)
+ .apply {
+ putExtra(EXTRA_PLAY_LIST, videoPlayList)
+ putExtra(EXTRA_PLAY_INDEX, 0)
+ })
}
}
diff --git a/app/src/main/java/com/woka/webseries/views/fragments/WebShowFragment.kt b/app/src/main/java/com/woka/webseries/views/fragments/WebShowFragment.kt
index 2941e3e..8d1b652 100644
--- a/app/src/main/java/com/woka/webseries/views/fragments/WebShowFragment.kt
+++ b/app/src/main/java/com/woka/webseries/views/fragments/WebShowFragment.kt
@@ -16,6 +16,7 @@ import android.view.WindowManager
import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
+import androidx.navigation.fragment.navArgs
import com.google.android.material.tabs.TabLayout
import com.jwplayer.pub.api.media.playlists.PlaylistItem
import com.woka.R
@@ -43,23 +44,16 @@ import com.woka.webseries.viewmodel.WebSeriesViewModel
import com.woka.webseries.views.WebSeriesActivity.Companion.EXTRA_SHOW_ID
import kotlin.math.max
-class WebShowFragment private constructor(
- private var showData: ShowData,
- private val categoryId: String,
- private val onShowDataChange: ((ShowData, String) -> Unit)? = null
-) : Fragment(), TabLayout.OnTabSelectedListener {
-
- companion object {
- fun newInstance(
- showData: ShowData,
- categoryId: String,
- onShowDataChange: ((ShowData, String) -> Unit)? = null
- ) =
- WebShowFragment(showData, categoryId, onShowDataChange)
- }
+class WebShowFragment: Fragment(), TabLayout.OnTabSelectedListener {
private lateinit var binding: FragmentWebShowBinding
- private var viewModel: WebSeriesViewModel? = null
+ private lateinit var viewModel: WebSeriesViewModel
+
+ // args
+ private val args by navArgs()
+
+ private val showData: ShowData by lazy { args.showData }
+ private val categoryId: String by lazy { args.categoryId }
// variables
@@ -89,11 +83,10 @@ class WebShowFragment private constructor(
savedInstanceState: Bundle?
): View {
binding = FragmentWebShowBinding.inflate(inflater, container, false)
- viewModel = ViewModelProvider(this)[WebSeriesViewModel::class.java]
+ viewModel = ViewModelProvider(requireActivity())[WebSeriesViewModel::class.java]
activity?.let {
it.window.setBackgroundDrawableResource(R.color.web_show_bg)
it.window.lightStatusBar(true)
- viewModel = ViewModelProvider(it)[WebSeriesViewModel::class.java]
}
return binding.root
}
@@ -112,7 +105,7 @@ class WebShowFragment private constructor(
setObservers()
binding.seasonProgressView.show()
- viewModel?.seasonListing("${showData.id}", categoryId)
+ viewModel.seasonListing("${showData.id}", categoryId)
}
override fun onDestroyView() {
@@ -128,12 +121,12 @@ class WebShowFragment private constructor(
it.window.lightStatusBar(false)
}
- viewModel?.clearSeasonLiveData()
- viewModel?.clearEpisodeListingLiveData()
- viewModel?.clearTeaserListingLiveData()
+ viewModel.clearSeasonLiveData()
+ viewModel.clearEpisodeListingLiveData()
+ viewModel.clearTeaserListingLiveData()
if (showDataChanged) {
- onShowDataChange?.invoke(showData, categoryId)
+ viewModel.onShowDataChanged?.invoke(showData, categoryId)
}
}
@@ -171,7 +164,7 @@ class WebShowFragment private constructor(
epLoadMoreBtn.setOnClickListener {
loadMoreEpisodes = true
- viewModel?.loadMoreEpisodes("${showData.id}", selectedSeasonId)
+ viewModel.loadMoreEpisodes("${showData.id}", selectedSeasonId)
}
likeSeason.setOnClickListener {
@@ -243,7 +236,7 @@ class WebShowFragment private constructor(
playTrailer.setOnClickListener {
if (seasonsTab.selectedTabPosition >= 0) {
- viewModel?.seasonListingMap?.get("${showData.id}_${categoryId}")
+ viewModel.seasonListingMap["${showData.id}_${categoryId}"]
?.let { seasonList ->
if (seasonsTab.selectedTabPosition < seasonList.size) {
seasonList[seasonsTab.selectedTabPosition].let { seasonData ->
@@ -318,7 +311,7 @@ class WebShowFragment private constructor(
// callbacks
private fun setObservers() {
- viewModel?.seasonListingLiveData?.observe(viewLifecycleOwner) {
+ viewModel.seasonListingLiveData.observe(viewLifecycleOwner) {
binding.seasonsTab.removeAllTabs()
when (it) {
is ApiResult.Error -> {
@@ -342,7 +335,7 @@ class WebShowFragment private constructor(
}
}
- viewModel?.episodeListingLiveData?.observe(viewLifecycleOwner) {
+ viewModel.episodeListingLiveData.observe(viewLifecycleOwner) {
when (it) {
is ApiResult.Error -> {
binding.epShimmer.hide()
@@ -373,7 +366,7 @@ class WebShowFragment private constructor(
binding.epShimmer.hide()
binding.epLoadMoreBtn.text = getString(R.string.load_more)
- binding.epLoadMoreBtn.setVisibility(viewModel?.episodePagingData?.get("${showData.id}_$selectedSeasonId")?.lastPage == false)
+ binding.epLoadMoreBtn.setVisibility(viewModel.episodePagingData["${showData.id}_$selectedSeasonId"]?.lastPage == false)
if (loadMoreEpisodes) {
// loaded more data
@@ -390,7 +383,7 @@ class WebShowFragment private constructor(
}
}
- viewModel?.teaserListingLiveData?.observe(viewLifecycleOwner) {
+ viewModel.teaserListingLiveData.observe(viewLifecycleOwner) {
when (it) {
is ApiResult.Error -> {
binding.rvTeaser.hide()
@@ -490,7 +483,7 @@ class WebShowFragment private constructor(
startActivity(Intent(it, PlayerActivity::class.java).apply {
putExtra(
PlayerActivity.EXTRA_PLAY_LIST,
- viewModel?.episodesPlaylistMap?.get("${showData.id}_${selectedSeasonId}_$categoryId")
+ viewModel.episodesPlaylistMap["${showData.id}_${selectedSeasonId}_$categoryId"]
)
putExtra(PlayerActivity.EXTRA_PLAY_INDEX, position)
})
@@ -565,7 +558,7 @@ class WebShowFragment private constructor(
private fun loadSeasonData() {
binding.apply {
if (seasonsTab.selectedTabPosition >= 0) {
- viewModel?.seasonListingMap?.get("${showData.id}_${categoryId}")
+ viewModel.seasonListingMap["${showData.id}_${categoryId}"]
?.let { seasonList ->
if (seasonsTab.selectedTabPosition < seasonList.size) {
seasonList[seasonsTab.selectedTabPosition].let { seasonData ->
@@ -579,8 +572,8 @@ class WebShowFragment private constructor(
selectedSeasonId = it
loadMoreEpisodes = false
- viewModel?.loadEpisodes("${showData.id}", it)
- viewModel?.loadTeasers("${showData.id}", it)
+ viewModel.loadEpisodes("${showData.id}", it)
+ viewModel.loadTeasers("${showData.id}", it)
}
seasonYear.text = "${seasonData.release_year}"
@@ -631,7 +624,7 @@ class WebShowFragment private constructor(
startActivity(Intent(it, PlayerActivity::class.java).apply {
putExtra(
PlayerActivity.EXTRA_PLAY_LIST,
- viewModel?.teaserPlaylistMap?.get("${showData.id}_${selectedSeasonId}_$categoryId")
+ viewModel.teaserPlaylistMap["${showData.id}_${selectedSeasonId}_$categoryId"]
)
putExtra(PlayerActivity.EXTRA_PLAY_INDEX, position)
})
diff --git a/app/src/main/res/layout/activity_blogs.xml b/app/src/main/res/layout/activity_blogs.xml
new file mode 100644
index 0000000..f8ac51d
--- /dev/null
+++ b/app/src/main/res/layout/activity_blogs.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_web_series.xml b/app/src/main/res/layout/activity_web_series.xml
index 1b84ca5..f7eb5b2 100644
--- a/app/src/main/res/layout/activity_web_series.xml
+++ b/app/src/main/res/layout/activity_web_series.xml
@@ -1,7 +1,11 @@
\ No newline at end of file
+ app:defaultNavHost="true"
+ app:navGraph="@navigation/nav_graph_web_series"
+ tools:context=".webseries.views.WebSeriesActivity" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/blog_view_holder.xml b/app/src/main/res/layout/blog_view_holder.xml
index 9f8822e..7f10c6e 100644
--- a/app/src/main/res/layout/blog_view_holder.xml
+++ b/app/src/main/res/layout/blog_view_holder.xml
@@ -4,7 +4,6 @@
android:layout_width="wrap_content"
android:layout_height="@dimen/_130sdp"
xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/round_bg_5"
android:backgroundTint="@color/white"
android:layout_marginStart="15dp"
diff --git a/app/src/main/res/layout/blog_view_holder_grid.xml b/app/src/main/res/layout/blog_view_holder_grid.xml
new file mode 100644
index 0000000..0f7018f
--- /dev/null
+++ b/app/src/main/res/layout/blog_view_holder_grid.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_blogs.xml b/app/src/main/res/layout/dialog_blogs.xml
index 4f17ebb..519a9b6 100644
--- a/app/src/main/res/layout/dialog_blogs.xml
+++ b/app/src/main/res/layout/dialog_blogs.xml
@@ -37,13 +37,10 @@
app:cardCornerRadius="15dp"
>
-
diff --git a/app/src/main/res/layout/fragment_web_series.xml b/app/src/main/res/layout/fragment_web_series.xml
index b6f0280..25e2a71 100644
--- a/app/src/main/res/layout/fragment_web_series.xml
+++ b/app/src/main/res/layout/fragment_web_series.xml
@@ -7,7 +7,7 @@
android:layout_height="match_parent"
android:background="@drawable/gradient_web_series"
android:orientation="vertical"
- tools:context=".webseries.views.WebSeriesActivity">
+ tools:context="com.woka.webseries.views.fragments.WebSeriesFragment">
diff --git a/app/src/main/res/layout/fragment_web_show.xml b/app/src/main/res/layout/fragment_web_show.xml
index d80f7c1..8945339 100644
--- a/app/src/main/res/layout/fragment_web_show.xml
+++ b/app/src/main/res/layout/fragment_web_show.xml
@@ -5,7 +5,9 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/color_primary">
+ android:background="@color/color_primary"
+ tools:context=".webseries.views.fragments.WebShowFragment"
+ >
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index b2307ae..7c27f8a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,4 +3,5 @@ plugins {
alias(libs.plugins.androidApplication) apply false
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
alias(libs.plugins.navigationSafeArgs) apply false
+ alias(libs.plugins.ksp) apply false
}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index eea2e6d..1e539ae 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,6 +1,6 @@
[versions]
agp = "8.3.0"
-kotlin = "1.9.0"
+kotlin = "2.0.0"
coreKtx = "1.12.0"
junit = "4.13.2"
junitVersion = "1.1.5"
@@ -12,9 +12,13 @@ constraintlayout = "2.1.4"
navigationFragmentKtx = "2.7.7"
navigationUiKtx = "2.7.7"
navigationSafeArgs = "2.7.7"
+roomKtx = "2.6.1"
+roomRuntime = "2.6.1"
+ksp = "2.0.0-1.0.24"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
+androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
@@ -24,8 +28,10 @@ androidx-activity = { group = "androidx.activity", name = "activity", version.re
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" }
+room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomKtx" }
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
-navigationSafeArgs = {id = "androidx.navigation.safeargs.kotlin", version.ref = "navigationSafeArgs"}
\ No newline at end of file
+navigationSafeArgs = {id = "androidx.navigation.safeargs.kotlin", version.ref = "navigationSafeArgs"}
+ksp = {id = "com.google.devtools.ksp", version.ref = "ksp"}
\ No newline at end of file