diff --git a/app/build.gradle b/app/build.gradle index 39c598b..8c45dde 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,8 @@ plugins { id("kotlin-parcelize") alias(libs.plugins.navigationSafeArgs) alias(libs.plugins.ksp) + id 'com.google.gms.google-services' + id 'com.google.firebase.firebase-perf' } android { @@ -115,6 +117,9 @@ dependencies { // audio mixer for karaoke implementation("com.github.ZeroOneZeroR:android_audio_mixer:v1.1") + // one-signal + implementation(libs.onesignal) + // room-database def room_version = "2.6.1" implementation(libs.androidx.room.runtime) @@ -123,6 +128,9 @@ dependencies { // optional - Kotlin Extensions and Coroutines support for Room implementation(libs.room.ktx) + implementation libs.firebase.analytics + implementation libs.firebase.perf + implementation libs.androidx.core.ktx implementation libs.androidx.appcompat implementation libs.material diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..030e018 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,30 @@ +{ + "project_info": { + "project_number": "15836861503", + "project_id": "wokaga-19312", + "storage_bucket": "wokaga-19312.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:15836861503:android:3bb57b5699be379466548a", + "android_client_info": { + "package_name": "com.woka" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyDZuTUtZCL7fDKAiUgVt6IjytuH9Zz48Hg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + }, + "admob_app_id": "ca-app-pub-5699008063638916~5336678778" + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 51d6c5e..e09df64 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,7 +48,7 @@ android:screenOrientation="portrait" /> (EXTRA_SHOW_DATA)?.let { showData -> - val hPos = - webSeriesHAdapter.currentList.indexOfFirst { it.id == showData.id } + val hPos = webSeriesHAdapter.currentList.indexOfFirst { it.id == showData.id } if (hPos >= 0 && hPos < webSeriesHAdapter.currentList.size) { webSeriesHAdapter.currentList[hPos].likes_count = showData.likes_count webSeriesHAdapter.currentList[hPos].is_liked = showData.is_liked - webSeriesHAdapter.currentList[hPos].bookmark_category_ids = - showData.favourite_category_ids + webSeriesHAdapter.currentList[hPos].bookmark_category_ids = showData.favourite_category_ids } - val ePos = - webSeriesEAdapter.currentList.indexOfFirst { it.id == showData.id } + val ePos = webSeriesEAdapter.currentList.indexOfFirst { it.id == showData.id } if (ePos >= 0 && ePos < webSeriesEAdapter.currentList.size) { webSeriesEAdapter.currentList[ePos].likes_count = showData.likes_count webSeriesEAdapter.currentList[ePos].is_liked = showData.is_liked - webSeriesEAdapter.currentList[hPos].bookmark_category_ids = - showData.favourite_category_ids + webSeriesEAdapter.currentList[ePos].bookmark_category_ids = showData.favourite_category_ids } } } @@ -324,53 +331,29 @@ class MyListFragment : Fragment() { progressBar.hide() result.show_data?.let { showData -> - if (showData.isNotEmpty()) { - val engList = mutableListOf() - val hinList = mutableListOf() - - for (show in showData) { - if (show.bookmark_category_ids?.isEmpty() == true) continue - - val ids = show.bookmark_category_ids?.split(",") - ids?.let { bIds -> - if (bIds.isNotEmpty()) { - when (bIds.size) { - 1 -> if (bIds[0] == "1") engList.add(show) else hinList.add( - show - ) - - else -> { - engList.add(show) - hinList.add(show) - } - } - } - } - } - + showData.english?.let {engList -> if (engList.isNotEmpty()) { webSeriesEnglishView.show() dataLoaded = true - webSeriesEAdapter.submitList(engList) + webSeriesEAdapter.submitList(ArrayList(engList)) - webSeriesEngViewAll.setVisibility(showData.size >= 3) + webSeriesEngViewAll.setVisibility(engList.size >= 3) } else { onListGotEmpty(PostType.WEB_SERIES, true) } + } + + showData.hindi?.let {hinList -> if (hinList.isNotEmpty()) { webSeriesHindiView.show() dataLoaded = true - webSeriesHAdapter.submitList(hinList) + webSeriesHAdapter.submitList(ArrayList(hinList)) - webSeriesHinViewAll.setVisibility(showData.size >= 3) + webSeriesHinViewAll.setVisibility(hinList.size >= 3) } else { onListGotEmpty(PostType.WEB_SERIES, false) } - - } else { - webSeriesEnglishView.hide() - webSeriesHindiView.hide() } } @@ -542,31 +525,43 @@ class MyListFragment : Fragment() { onListGotEmpty(PostType.WEB_SERIES, false) } - MyListRepository.updateSeriesList(Collections.emptyList()) + MyListRepository.updateSeriesList(Collections.emptyList(), showCategory) } is ApiResult.Loading -> {} is ApiResult.Success -> { response.data?.result?.show_data?.let { - if (showCategory == "1") { - if (it.isNotEmpty()) { - webSeriesEAdapter.submitList(it) - } else { - onListGotEmpty(PostType.WEB_SERIES, true) + when (showCategory){ + "1" -> { + it.english?.let {engList -> + if (engList.isNotEmpty()) { + webSeriesEAdapter.submitList(engList) + } else { + onListGotEmpty(PostType.WEB_SERIES, true) + } + + binding.webSeriesEngViewAll.setVisibility(engList.size >= 3) + + MyListRepository.updateSeriesList(engList, showCategory) + } } - binding.webSeriesEngViewAll.setVisibility(it.size >= 3) - } else if (showCategory == "18") { - if (it.isNotEmpty()) { - webSeriesHAdapter.submitList(it) - } else { - onListGotEmpty(PostType.WEB_SERIES, false) + "18" -> { + it.hindi?.let {hinList -> + if (hinList.isNotEmpty()) { + webSeriesHAdapter.submitList(hinList) + } else { + onListGotEmpty(PostType.WEB_SERIES, false) + } + + binding.webSeriesHinViewAll.setVisibility(hinList.size >= 3) + + MyListRepository.updateSeriesList(hinList, showCategory) + } } - binding.webSeriesHinViewAll.setVisibility(it.size >= 3) + else -> {} } - - MyListRepository.updateSeriesList(it) } } } @@ -657,6 +652,8 @@ class MyListFragment : Fragment() { like.isSelected = !like.isSelected likeCount.text = "${audioBookData.likes_count}" + + clickHelper.upsertClickEvent(ContentType.AUDIO, audioBookData.id) } fav.setOnClickListener { @@ -672,6 +669,8 @@ class MyListFragment : Fragment() { fav.isSelected = !fav.isSelected itemRemovedFromDialog = !fav.isSelected + + clickHelper.upsertClickEvent(ContentType.AUDIO, audioBookData.id) } close.setOnClickListener { @@ -686,6 +685,8 @@ class MyListFragment : Fragment() { // item was not at last removed MyListRepository.setLoadNewDataFlag(false) } + + clickHelper.upsertClickEvent(ContentType.AUDIO, audioBookData.id) } itemRemovedFromDialog = false @@ -761,7 +762,12 @@ class MyListFragment : Fragment() { .build() ) }, - null + mutableListOf( + VideoViewRequestData( + audioBookData.id, + ContentType.AUDIO + ) + ) ) ) putExtra(PlayerActivity.EXTRA_PLAY_INDEX, 0) @@ -842,7 +848,11 @@ class MyListFragment : Fragment() { startActivity(Intent(activity, GamePlayerActivity::class.java).apply { putExtra( GamePlayerActivity.EXTRA_GAME_PLAYER_DATA, - GamePlayerData(it, gameData.screen_orientation == "Landscape") + GamePlayerData( + gameData.id, + it, + gameData.screen_orientation == "Landscape" + ) ) }) @@ -867,6 +877,8 @@ class MyListFragment : Fragment() { like.isSelected = !like.isSelected likeCount.text = "${gameData.likes_count}" + + clickHelper.upsertClickEvent(ContentType.GAME, gameData.id) } fav.setOnClickListener { @@ -882,6 +894,8 @@ class MyListFragment : Fragment() { fav.isSelected = !fav.isSelected itemRemovedFromDialog = !fav.isSelected + + clickHelper.upsertClickEvent(ContentType.GAME, gameData.id) } close.setOnClickListener { @@ -896,6 +910,8 @@ class MyListFragment : Fragment() { // item was not at last removed MyListRepository.setLoadNewDataFlag(false) } + + clickHelper.upsertClickEvent(ContentType.GAME, gameData.id) } itemRemovedFromDialog = false @@ -984,12 +1000,19 @@ class MyListFragment : Fragment() { ).apply { putExtra( KaraokePlayerActivity.EXTRA_KARAOKE_DATA, - KaraokePlayerData(it, karaokeData.title) + KaraokePlayerData( + it, + karaokeData.title, + karaokeData.id + ) ) }) } } - clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) + clickHelper.upsertClickEvent( + ContentType.KARAOKE_VIDEO, + karaokeData.id + ) } } } else { @@ -1012,12 +1035,19 @@ class MyListFragment : Fragment() { ).apply { putExtra( KaraokePlayerActivity.EXTRA_KARAOKE_DATA, - KaraokePlayerData(it, karaokeData.title) + KaraokePlayerData( + it, + karaokeData.title, + karaokeData.id + ) ) }) } } - clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) + clickHelper.upsertClickEvent( + ContentType.KARAOKE_VIDEO, + karaokeData.id + ) } } } @@ -1054,6 +1084,8 @@ class MyListFragment : Fragment() { like.isSelected = !like.isSelected likeCount.text = "${karaokeData.likes_count}" + + clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) } fav.setOnClickListener { @@ -1069,6 +1101,8 @@ class MyListFragment : Fragment() { fav.isSelected = !fav.isSelected itemRemovedFromDialog = !fav.isSelected + + clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) } close.setOnClickListener { @@ -1083,6 +1117,8 @@ class MyListFragment : Fragment() { // item was not at last removed MyListRepository.setLoadNewDataFlag(false) } + + clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) } itemRemovedFromDialog = false 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 d6a7f8f..d0e059a 100644 --- a/app/src/main/java/com/woka/home/mylist/MyListRepository.kt +++ b/app/src/main/java/com/woka/home/mylist/MyListRepository.kt @@ -6,6 +6,7 @@ import com.woka.home.mylist.models.FavGameData import com.woka.home.mylist.models.FavKaraokeData import com.woka.home.mylist.models.MyListResponse import com.woka.home.mylist.models.Result +import com.woka.home.mylist.models.ShowDataResponse import com.woka.networking.ApiResult import com.woka.userdata.UserRepository @@ -14,7 +15,7 @@ object MyListRepository { private var myFavData: MyListResponse = MyListResponse(Result( ArrayList(), ArrayList(), - ArrayList(), + ShowDataResponse(ArrayList(), ArrayList()), ArrayList(), ArrayList(), 0 @@ -34,7 +35,8 @@ object MyListRepository { fun clearData(){ shallLoadNewData = true myFavData.result?.let { - it.show_data?.clear() + it.show_data?.hindi?.clear() + it.show_data?.english?.clear() it.game_data?.clear() it.audio_data?.clear() it.sing_karaoke_data?.clear() @@ -64,9 +66,17 @@ object MyListRepository { } } - fun updateSeriesList(bookmarkedShowData: MutableList) { - myFavData.result?.show_data?.clear() - myFavData.result?.show_data?.addAll(bookmarkedShowData) + fun updateSeriesList(bookmarkedShowData: MutableList, categoryId: String) { + when (categoryId){ + "1" -> { + myFavData.result?.show_data?.english?.clear() + myFavData.result?.show_data?.english?.addAll(bookmarkedShowData) + } + "18" -> { + myFavData.result?.show_data?.hindi?.clear() + myFavData.result?.show_data?.hindi?.addAll(bookmarkedShowData) + } + } shallLoadNewData = false } diff --git a/app/src/main/java/com/woka/home/mylist/models/Result.kt b/app/src/main/java/com/woka/home/mylist/models/Result.kt index 47eddac..74d9af8 100644 --- a/app/src/main/java/com/woka/home/mylist/models/Result.kt +++ b/app/src/main/java/com/woka/home/mylist/models/Result.kt @@ -3,7 +3,7 @@ package com.woka.home.mylist.models data class Result( val audio_data: ArrayList?, val game_data: ArrayList?, - val show_data: ArrayList?, + val show_data: ShowDataResponse?, val sing_karaoke_data: ArrayList?, val video_data: ArrayList?, val total_records: Int? diff --git a/app/src/main/java/com/woka/home/mylist/models/ShowDataResponse.kt b/app/src/main/java/com/woka/home/mylist/models/ShowDataResponse.kt new file mode 100644 index 0000000..2f14f0c --- /dev/null +++ b/app/src/main/java/com/woka/home/mylist/models/ShowDataResponse.kt @@ -0,0 +1,6 @@ +package com.woka.home.mylist.models + +data class ShowDataResponse( + val english: ArrayList?, + val hindi: ArrayList? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/mylist/view/FavoritesActivity.kt b/app/src/main/java/com/woka/home/mylist/view/FavoritesActivity.kt index 9cf30f2..4e511ee 100644 --- a/app/src/main/java/com/woka/home/mylist/view/FavoritesActivity.kt +++ b/app/src/main/java/com/woka/home/mylist/view/FavoritesActivity.kt @@ -9,6 +9,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.woka.R +import com.woka.database.helpers.ClicksHelper import com.woka.database.models.clicks.ContentType import com.woka.databinding.ActivityFavoritesBinding import com.woka.home.mylist.view.fragments.FavAudioFragment @@ -60,6 +61,13 @@ class FavoritesActivity : AppCompatActivity() { initFragment() } + @Suppress("DEPRECATION") + @Deprecated("Deprecated in Java") + override fun onBackPressed() { + super.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) + } + private fun initViews(){ binding.apply { title.text = favTitle @@ -70,6 +78,7 @@ class FavoritesActivity : AppCompatActivity() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } diff --git a/app/src/main/java/com/woka/home/mylist/view/fragments/FavAudioFragment.kt b/app/src/main/java/com/woka/home/mylist/view/fragments/FavAudioFragment.kt index 425d7e4..c5ff4cc 100644 --- a/app/src/main/java/com/woka/home/mylist/view/fragments/FavAudioFragment.kt +++ b/app/src/main/java/com/woka/home/mylist/view/fragments/FavAudioFragment.kt @@ -28,6 +28,7 @@ import com.woka.home.mylist.MyListRepository import com.woka.home.mylist.viewmodel.FavoriteViewModel import com.woka.networking.ApiResult import com.woka.players.models.VideoPlayList +import com.woka.players.models.VideoViewRequestData import com.woka.players.views.PlayerActivity import com.woka.utils.hide import com.woka.utils.isNetworkConnected @@ -59,7 +60,8 @@ class FavAudioFragment : Fragment() { ): View { binding = FragmentFavoritesBinding.inflate(inflater, container, false) viewModel = ViewModelProvider(requireActivity())[FavoriteViewModel::class.java] - adapter = AudioBooksAdapter(requireContext(), ::onAudioBookClicked, ::onBookChanged, false){} + adapter = + AudioBooksAdapter(requireContext(), ::onAudioBookClicked, ::onBookChanged, false) {} return binding.root } @@ -79,22 +81,23 @@ class FavAudioFragment : Fragment() { setObservers() - if (!viewModel.favoritesLiveData.isInitialized || viewModel.favoritesLiveData.value !is ApiResult.Success){ + if (!viewModel.favoritesLiveData.isInitialized || viewModel.favoritesLiveData.value !is ApiResult.Success) { viewModel.loadFavorites(ContentType.AUDIO) } } - private fun initViews(){ + private fun initViews() { binding.apply { rvFavorites.adapter = adapter } } - private fun clickEvents(){ + private fun clickEvents() { binding.apply { loadMoreBtn.setOnClickListener { viewModel.loadFavorites(ContentType.AUDIO) + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } @@ -129,16 +132,16 @@ class FavAudioFragment : Fragment() { } } - private fun setObservers(){ - viewModel.favoritesLiveData.observe(viewLifecycleOwner){ + private fun setObservers() { + viewModel.favoritesLiveData.observe(viewLifecycleOwner) { binding.apply { - when (it){ + when (it) { is ApiResult.Error -> { - if (adapter.itemCount == 0){ + if (adapter.itemCount == 0) { // no orders at all dataView.hide() noData.show() - }else{ + } else { // load more orders failed dataView.show() shimmer.hide() @@ -147,6 +150,7 @@ class FavAudioFragment : Fragment() { loadMoreBtn.show() } } + is ApiResult.Loading -> { noData.hide() @@ -155,8 +159,9 @@ class FavAudioFragment : Fragment() { loadMoreBtn.hide() } + is ApiResult.Success -> { - it.data?.result?.audio_data?.let {audioList -> + it.data?.result?.audio_data?.let { audioList -> noData.hide() dataView.show() @@ -173,9 +178,7 @@ class FavAudioFragment : Fragment() { } } - private fun onBookChanged(i: Int, audioBookData: AudioBookData) { - - } + private fun onBookChanged(i: Int, audioBookData: AudioBookData) {} private fun onAudioBookClicked(audioBookData: AudioBookData) { dialogBinding.apply { @@ -260,6 +263,8 @@ class FavAudioFragment : Fragment() { like.isSelected = !like.isSelected likeCount.text = "${audioBookData.likes_count}" + + clickHelper.upsertClickEvent(ContentType.AUDIO, audioBookData.id) } fav.setOnClickListener { @@ -276,6 +281,8 @@ class FavAudioFragment : Fragment() { audioBookData.mark_as_favourite = !fav.isSelected fav.isSelected = !fav.isSelected itemRemovedFromDialog = !fav.isSelected + + clickHelper.upsertClickEvent(ContentType.AUDIO, audioBookData.id) } close.setOnClickListener { @@ -290,6 +297,8 @@ class FavAudioFragment : Fragment() { // item was not at last removed MyListRepository.setLoadNewDataFlag(false) } + + clickHelper.upsertClickEvent(ContentType.AUDIO, audioBookData.id) } itemRemovedFromDialog = false @@ -336,7 +345,12 @@ class FavAudioFragment : Fragment() { .build() ) }, - null + mutableListOf( + VideoViewRequestData( + audioBookData.id, + ContentType.AUDIO + ) + ) ) ) putExtra(PlayerActivity.EXTRA_PLAY_INDEX, 0) diff --git a/app/src/main/java/com/woka/home/mylist/view/fragments/FavGameFragment.kt b/app/src/main/java/com/woka/home/mylist/view/fragments/FavGameFragment.kt index eea7822..99ee7ba 100644 --- a/app/src/main/java/com/woka/home/mylist/view/fragments/FavGameFragment.kt +++ b/app/src/main/java/com/woka/home/mylist/view/fragments/FavGameFragment.kt @@ -125,6 +125,7 @@ class FavGameFragment : Fragment() { binding.apply { loadMoreBtn.setOnClickListener { viewModel.loadFavorites(ContentType.GAME) + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } @@ -242,7 +243,7 @@ class FavGameFragment : Fragment() { startActivity(Intent(activity, GamePlayerActivity::class.java).apply { putExtra( GamePlayerActivity.EXTRA_GAME_PLAYER_DATA, - GamePlayerData(it, gameData.screen_orientation == "Landscape") + GamePlayerData(gameData.id, it, gameData.screen_orientation == "Landscape") ) }) @@ -267,6 +268,8 @@ class FavGameFragment : Fragment() { like.isSelected = !like.isSelected likeCount.text = "${gameData.likes_count}" + + clickHelper.upsertClickEvent(ContentType.GAME, gameData.id) } fav.setOnClickListener { @@ -283,6 +286,8 @@ class FavGameFragment : Fragment() { gameData.mark_as_favourite = !fav.isSelected fav.isSelected = !fav.isSelected itemRemovedFromDialog = !fav.isSelected + + clickHelper.upsertClickEvent(ContentType.GAME, gameData.id) } close.setOnClickListener { @@ -297,6 +302,8 @@ class FavGameFragment : Fragment() { // item was not at last removed MyListRepository.setLoadNewDataFlag(false) } + + clickHelper.upsertClickEvent(ContentType.GAME, gameData.id) } itemRemovedFromDialog = false diff --git a/app/src/main/java/com/woka/home/mylist/view/fragments/FavKaraokeFragment.kt b/app/src/main/java/com/woka/home/mylist/view/fragments/FavKaraokeFragment.kt index bf77025..5e3a652 100644 --- a/app/src/main/java/com/woka/home/mylist/view/fragments/FavKaraokeFragment.kt +++ b/app/src/main/java/com/woka/home/mylist/view/fragments/FavKaraokeFragment.kt @@ -124,6 +124,7 @@ class FavKaraokeFragment : Fragment() { binding.apply { loadMoreBtn.setOnClickListener { viewModel.loadFavorites(ContentType.KARAOKE_VIDEO) + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } @@ -172,9 +173,7 @@ class FavKaraokeFragment : Fragment() { } } - private fun onKaraokeChanged(i: Int, b: Boolean, karaokeData: KaraokeData) { - - } + private fun onKaraokeChanged(i: Int, b: Boolean, karaokeData: KaraokeData) {} private fun onKaraokeClicked(karaokeData: KaraokeData) { dialogBinding.apply { @@ -223,7 +222,7 @@ class FavKaraokeFragment : Fragment() { ).apply { putExtra( KaraokePlayerActivity.EXTRA_KARAOKE_DATA, - KaraokePlayerData(it, karaokeData.title) + KaraokePlayerData(it, karaokeData.title, karaokeData.id) ) }) } @@ -251,7 +250,7 @@ class FavKaraokeFragment : Fragment() { ).apply { putExtra( KaraokePlayerActivity.EXTRA_KARAOKE_DATA, - KaraokePlayerData(it, karaokeData.title) + KaraokePlayerData(it, karaokeData.title, karaokeData.id) ) }) } @@ -293,6 +292,8 @@ class FavKaraokeFragment : Fragment() { like.isSelected = !like.isSelected likeCount.text = "${karaokeData.likes_count}" + + clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) } fav.setOnClickListener { @@ -309,6 +310,8 @@ class FavKaraokeFragment : Fragment() { karaokeData.mark_as_favourite = !fav.isSelected fav.isSelected = !fav.isSelected itemRemovedFromDialog = !fav.isSelected + + clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) } close.setOnClickListener { @@ -323,6 +326,8 @@ class FavKaraokeFragment : Fragment() { // item was not at last removed MyListRepository.setLoadNewDataFlag(false) } + + clickHelper.upsertClickEvent(ContentType.KARAOKE_VIDEO, karaokeData.id) } itemRemovedFromDialog = false diff --git a/app/src/main/java/com/woka/home/mylist/view/fragments/FavSeriesFragment.kt b/app/src/main/java/com/woka/home/mylist/view/fragments/FavSeriesFragment.kt index 1f3f1a2..5b40430 100644 --- a/app/src/main/java/com/woka/home/mylist/view/fragments/FavSeriesFragment.kt +++ b/app/src/main/java/com/woka/home/mylist/view/fragments/FavSeriesFragment.kt @@ -73,6 +73,7 @@ class FavSeriesFragment : Fragment() { binding.apply { loadMoreBtn.setOnClickListener { viewModel.loadFavorites(ContentType.SERIES, if (viewModel.webSeriesIsEnglish) "1" else "18") + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } @@ -104,7 +105,7 @@ class FavSeriesFragment : Fragment() { loadMoreBtn.hide() } is ApiResult.Success -> { - it.data?.result?.show_data?.let {showList -> + it.data?.result?.show_data?.let {showData -> noData.hide() dataView.show() @@ -113,7 +114,15 @@ class FavSeriesFragment : Fragment() { loadMoreBtn.text = getString(R.string.load_more) loadMoreBtn.setVisibility(!viewModel.lastPage) - adapter.submitListShowList(showList.map { ShowData(it) }, if (viewModel.webSeriesIsEnglish) "1" else "18") + if (viewModel.webSeriesIsEnglish){ + showData.english?.let {engList -> + adapter.submitListShowList(engList.map { ShowData(it) }, "1") + } + }else{ + showData.hindi?.let {hinList -> + adapter.submitListShowList(hinList.map { ShowData(it) }, "18") + } + } } } } @@ -132,16 +141,37 @@ class FavSeriesFragment : Fragment() { adapter.showList[hPos].likes_count = showData.likes_count adapter.showList[hPos].is_liked = showData.is_liked adapter.showList[hPos].favourite_category_ids = showData.favourite_category_ids + + result.data?.getStringExtra(EXTRA_SHOW_CATEGORY)?.let { showCategory -> + onWebShowItemChanged(hPos, showCategory) + } } } } } } - private fun onShowCommonDataChanged(showData: ShowData, categoryId: String) { + private fun onWebShowItemChanged(position: Int, showCategory: String) { + if (viewModel.lastPage){ + if (position >= 0 && position < adapter.showList.size){ + val list = adapter.showList.toMutableList() + list.removeAt(position) + if (list.isNotEmpty()){ + adapter.submitListShowList(list, showCategory) + }else{ + binding.noData.show() + binding.rvFavorites.hide() + } + } + }else{ + viewModel.resetPagination() + viewModel.loadFavorites(ContentType.SERIES, showCategory) + } } + private fun onShowCommonDataChanged(showData: ShowData, categoryId: String) {} + // web show private fun onWebShowClicked(showData: ShowData, categoryId: String) { webShowIntentLauncher?.launch(Intent(context, WebSeriesActivity::class.java).apply { diff --git a/app/src/main/java/com/woka/home/mylist/viewmodel/FavoriteViewModel.kt b/app/src/main/java/com/woka/home/mylist/viewmodel/FavoriteViewModel.kt index 4f911a7..e33604b 100644 --- a/app/src/main/java/com/woka/home/mylist/viewmodel/FavoriteViewModel.kt +++ b/app/src/main/java/com/woka/home/mylist/viewmodel/FavoriteViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.viewModelScope import com.woka.database.models.clicks.ContentType import com.woka.home.mylist.models.MyListResponse import com.woka.home.mylist.models.Result +import com.woka.home.mylist.models.ShowDataResponse import com.woka.networking.ApiResult import com.woka.userdata.UserRepository import kotlinx.coroutines.launch @@ -24,7 +25,7 @@ class FavoriteViewModel : ViewModel() { private val myListResponse = MyListResponse( Result( - ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), 0 + ArrayList(), ArrayList(), ShowDataResponse(ArrayList(), ArrayList()), ArrayList(), ArrayList(), 0 ) ) @@ -50,18 +51,38 @@ class FavoriteViewModel : ViewModel() { value.data?.let { when (contentType) { ContentType.SERIES -> { - it.result?.show_data?.let { newList -> + it.result?.show_data?.let { showData -> + when (categoryId){ + "1" -> { + showData.english?.let {newList -> + myListResponse.result?.show_data?.english?.addAll(newList) - myListResponse.result?.show_data?.addAll(newList) + lastPage = myListResponse.result?.show_data?.english?.size == it.result.total_records - lastPage = myListResponse.result?.show_data?.size == it.result.total_records + _favoritesLiveData.postValue( + ApiResult.Success( + myListResponse + ) + ) + nextPageToLoad++ + } + } + "18" -> { + showData.hindi?.let {newList -> + myListResponse.result?.show_data?.hindi?.addAll(newList) - _favoritesLiveData.postValue( - ApiResult.Success( - myListResponse - ) - ) - nextPageToLoad++ + lastPage = myListResponse.result?.show_data?.hindi?.size == it.result.total_records + + _favoritesLiveData.postValue( + ApiResult.Success( + myListResponse + ) + ) + nextPageToLoad++ + } + } + else -> {} + } } } @@ -122,4 +143,9 @@ class FavoriteViewModel : ViewModel() { } } } + + fun resetPagination() { + nextPageToLoad = 0 + lastPage = false + } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/sidebar/aboutwoka/AboutActivity.kt b/app/src/main/java/com/woka/home/sidebar/aboutwoka/AboutActivity.kt index 4a670f3..84ae70d 100644 --- a/app/src/main/java/com/woka/home/sidebar/aboutwoka/AboutActivity.kt +++ b/app/src/main/java/com/woka/home/sidebar/aboutwoka/AboutActivity.kt @@ -49,6 +49,7 @@ class AboutActivity : WokaBaseActivity() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } diff --git a/app/src/main/java/com/woka/home/sidebar/faqs/FaqActivity.kt b/app/src/main/java/com/woka/home/sidebar/faqs/FaqActivity.kt index d14c3d2..7cbf63f 100644 --- a/app/src/main/java/com/woka/home/sidebar/faqs/FaqActivity.kt +++ b/app/src/main/java/com/woka/home/sidebar/faqs/FaqActivity.kt @@ -83,6 +83,7 @@ class FaqActivity : AppCompatActivity() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } diff --git a/app/src/main/java/com/woka/home/sidebar/faqs/FaqsAdapter.kt b/app/src/main/java/com/woka/home/sidebar/faqs/FaqsAdapter.kt index a81b51e..c4de68c 100644 --- a/app/src/main/java/com/woka/home/sidebar/faqs/FaqsAdapter.kt +++ b/app/src/main/java/com/woka/home/sidebar/faqs/FaqsAdapter.kt @@ -9,6 +9,8 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.woka.R +import com.woka.database.helpers.ClicksHelper +import com.woka.database.models.clicks.ContentType import com.woka.databinding.FaqViewHolderBinding import com.woka.modules.faqs.models.Faq import com.woka.utils.hide @@ -84,6 +86,7 @@ class FaqsAdapter(config: AsyncDifferConfig) : openedFaq = position } + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } diff --git a/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt b/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt index b9c2ca9..3dfceb3 100644 --- a/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt +++ b/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt @@ -85,6 +85,7 @@ class UserProfileActivity : WokaBaseActivity() { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } update.setOnClickListener { diff --git a/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt b/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt index 0c319af..cadd073 100644 --- a/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt +++ b/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt @@ -153,6 +153,7 @@ class SupportActivity : WokaBaseActivity() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } submit.setOnClickListener { 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 73e1bc4..e0d9600 100644 --- a/app/src/main/java/com/woka/home/views/HomeActivity.kt +++ b/app/src/main/java/com/woka/home/views/HomeActivity.kt @@ -145,6 +145,8 @@ class HomeActivity : WokaBaseActivity(), decisionDialog.show() } + + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } override fun onDestroy() { 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 1e2550e..5077984 100644 --- a/app/src/main/java/com/woka/home/views/MoreHomeActivity.kt +++ b/app/src/main/java/com/woka/home/views/MoreHomeActivity.kt @@ -28,6 +28,7 @@ import com.woka.modules.wokasongs.WokaSongsAdapter import com.woka.modules.wokasongs.WokaSongsRepository import com.woka.networking.ApiResult import com.woka.players.models.VideoPlayList +import com.woka.players.models.VideoViewRequestData import com.woka.players.views.PlayerActivity import com.woka.utils.WokaBaseActivity import com.woka.utils.hide @@ -138,7 +139,12 @@ class MoreHomeActivity : WokaBaseActivity() { .build() ) }, - null + mutableListOf( + VideoViewRequestData( + 0, + ContentType.TEASER + ) + ) ) ) putExtra(PlayerActivity.EXTRA_PLAY_INDEX, 0) diff --git a/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt b/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt index 87673e0..07538d3 100644 --- a/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt +++ b/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt @@ -102,9 +102,10 @@ class KaraokeActivity : WokaBaseActivity() { } } - override fun onDestroy() { - super.onDestroy() - + @Suppress("DEPRECATION") + @Deprecated("Deprecated in Java") + override fun onBackPressed() { + super.onBackPressed() ClicksHelper.upsertClickEvent(ContentType.OTHERS) } @@ -158,6 +159,7 @@ class KaraokeActivity : WokaBaseActivity() { binding.apply { toolbar.backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } retryBtn.setOnClickListener { diff --git a/app/src/main/java/com/woka/modules/disclaimer/DisclaimerActivity.kt b/app/src/main/java/com/woka/modules/disclaimer/DisclaimerActivity.kt index 994b08a..8b6b5f5 100644 --- a/app/src/main/java/com/woka/modules/disclaimer/DisclaimerActivity.kt +++ b/app/src/main/java/com/woka/modules/disclaimer/DisclaimerActivity.kt @@ -27,6 +27,7 @@ class DisclaimerActivity : WokaBaseActivity() { binding.backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } diff --git a/app/src/main/java/com/woka/modules/webview/WebViewActivity.kt b/app/src/main/java/com/woka/modules/webview/WebViewActivity.kt index fdcda19..a287c20 100644 --- a/app/src/main/java/com/woka/modules/webview/WebViewActivity.kt +++ b/app/src/main/java/com/woka/modules/webview/WebViewActivity.kt @@ -74,6 +74,7 @@ class WebViewActivity : WokaBaseActivity() { override fun onSupportNavigateUp(): Boolean { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) return true } diff --git a/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt b/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt index 7803804..36efb14 100644 --- a/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt @@ -99,10 +99,6 @@ class GetMoreInfoFragment : Fragment() { } next.setOnClickListener { - if (viewModel.selectedGender == Gender.NONE) { - toast(getString(R.string.select_a_gender)) - return@setOnClickListener - } if (isUnder16 && viewModel.interestTopics.isEmpty()){ toast(getString(R.string.please_select_your_interests)) return@setOnClickListener diff --git a/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt b/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt index 2979f7e..5fe8e31 100644 --- a/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt @@ -12,6 +12,8 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import com.google.android.material.tabs.TabLayoutMediator +import com.google.firebase.analytics.ktx.analytics +import com.google.firebase.ktx.Firebase import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.database.helpers.ClicksHelper @@ -21,8 +23,10 @@ import com.woka.home.views.HomeActivity import com.woka.networking.ApiResult import com.woka.onboard.adapters.OnboardingAdapter import com.woka.onboard.mvvm.OnboardViewModel -import com.woka.utils.ProgressView import com.woka.userPreference.UserType +import com.woka.utils.ANALYTICS_GUEST_LOGIN +import com.woka.utils.ANALYTICS_NEW_USER +import com.woka.utils.ProgressView import com.woka.utils.toast class OnboardFragment : Fragment() { @@ -77,6 +81,11 @@ class OnboardFragment : Fragment() { userPrefs?.userType = UserType.GUEST userPrefs?.guestUserName = data.fullname + if (data.new_guest == true){ + Firebase.analytics.logEvent(ANALYTICS_GUEST_LOGIN, null) + Firebase.analytics.logEvent(ANALYTICS_NEW_USER, null) + } + activity?.let { activity-> startActivity(Intent(activity, HomeActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) diff --git a/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt index 0d3e3a0..93de522 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt @@ -2,12 +2,15 @@ package com.woka.onboard.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.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import com.google.firebase.analytics.ktx.analytics +import com.google.firebase.ktx.Firebase +import com.onesignal.OneSignal import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.database.helpers.ClicksHelper @@ -19,10 +22,12 @@ import com.woka.onboard.adapters.AvatarAdapter import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16 import com.woka.onboard.models.RegisterRequestData import com.woka.onboard.mvvm.OnboardViewModel +import com.woka.userPreference.UserType import com.woka.userdata.UserRepository +import com.woka.utils.ANALYTICS_NEW_USER +import com.woka.utils.ANALYTICS_USER_SIGN_UP import com.woka.utils.Gender import com.woka.utils.ProgressView -import com.woka.userPreference.UserType import com.woka.utils.toast import kotlinx.coroutines.launch import java.text.SimpleDateFormat @@ -86,13 +91,14 @@ class SelectAvatarFragment : Fragment() { birthdate = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(selectedDOB.time), email = email, full_name = name, - gender = if (selectedGender == Gender.MALE) "2" else "1", + gender = if (selectedGender == Gender.MALE) "2" else if (selectedGender == Gender.FEMALE)"1" else "0", guardian_email = if (isUnder16) email else null, language_id = if (userPrefs?.appLanguage == "en") "1" else "2", password = password, user_type = if (isUnder16) "1" else "2", username = userName, - interest_topic_id = if (isUnder16) interestTopics.toList() else null + interest_topic_id = if (isUnder16) interestTopics.toList() else null, + one_signal_player_id = OneSignal.User.onesignalId ) } @@ -158,6 +164,9 @@ class SelectAvatarFragment : Fragment() { UserRepository.logout() } + Firebase.analytics.logEvent(ANALYTICS_USER_SIGN_UP, null) + Firebase.analytics.logEvent(ANALYTICS_NEW_USER, null) + // saving to user prefs userPrefs?.accessToken = result.remember_token?:"no_token_received" userPrefs?.userType = UserType.createUserType(result.user_type) diff --git a/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt index b76203c..aa6fc06 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt @@ -3,13 +3,15 @@ package com.woka.onboard.fragments import android.content.Intent import android.graphics.Color import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager +import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import com.google.firebase.analytics.ktx.analytics +import com.google.firebase.ktx.Firebase import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.database.helpers.ClicksHelper @@ -19,9 +21,11 @@ import com.woka.home.views.HomeActivity import com.woka.networking.ApiResult import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_RESET_PASSWORD_INTENT import com.woka.onboard.mvvm.OnboardViewModel +import com.woka.userPreference.UserType +import com.woka.utils.ANALYTICS_GUEST_LOGIN +import com.woka.utils.ANALYTICS_NEW_USER import com.woka.utils.DecisionDialog import com.woka.utils.ProgressView -import com.woka.userPreference.UserType import com.woka.utils.toast class SignInFragment : Fragment() { @@ -86,7 +90,7 @@ class SignInFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel.loginLiveData.observe(viewLifecycleOwner){ it -> + viewModel.loginLiveData.observe(viewLifecycleOwner){ when(it){ is ApiResult.Error -> { progressView.hide() @@ -160,6 +164,11 @@ class SignInFragment : Fragment() { userPrefs?.userType = UserType.GUEST userPrefs?.guestUserName = data.fullname + if (data.new_guest == true){ + Firebase.analytics.logEvent(ANALYTICS_GUEST_LOGIN, null) + Firebase.analytics.logEvent(ANALYTICS_NEW_USER, null) + } + activity?.let { activity-> startActivity(Intent(activity, HomeActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) diff --git a/app/src/main/java/com/woka/onboard/models/RegisterRequestData.kt b/app/src/main/java/com/woka/onboard/models/RegisterRequestData.kt index d038b12..06ed22e 100644 --- a/app/src/main/java/com/woka/onboard/models/RegisterRequestData.kt +++ b/app/src/main/java/com/woka/onboard/models/RegisterRequestData.kt @@ -12,5 +12,6 @@ data class RegisterRequestData( val password: String?, val user_type: String?, val username: String?, - val interest_topic_id: List? + val interest_topic_id: List?, + val one_signal_player_id: String? ) \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt b/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt index 03ce903..1935568 100644 --- a/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt +++ b/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt @@ -1,5 +1,6 @@ package com.woka.onboard.mvvm +import com.onesignal.OneSignal import com.woka.WokaApp import com.woka.networking.ApiResult import com.woka.networking.RetrofitHelper.handleApiCall @@ -22,6 +23,7 @@ class OnboardRepository(private val apiService: OnboardApiService) { FormBody.Builder() .add("username", userName) .add("password", password) + .add("one_signal_player_id", OneSignal.User.onesignalId) .build() ) } @@ -33,6 +35,7 @@ class OnboardRepository(private val apiService: OnboardApiService) { FormBody.Builder() .add("username", userName) .add("password", password) + .add("one_signal_player_id", OneSignal.User.onesignalId) .add("is_activate", if (isActivate) "1" else "0") .build() ) @@ -151,7 +154,7 @@ class OnboardRepository(private val apiService: OnboardApiService) { FormBody.Builder() .add("language_id", if (WokaApp.userPrefs?.appLanguage == "hi") "2" else "1") .add("user_type", "3") - .add("one_signal_player_id", "test") + .add("one_signal_player_id", OneSignal.User.onesignalId) .add("device_type", "1") .build() ) diff --git a/app/src/main/java/com/woka/onboard/views/OnboardActivity.kt b/app/src/main/java/com/woka/onboard/views/OnboardActivity.kt index 45e4fc0..e7491cb 100644 --- a/app/src/main/java/com/woka/onboard/views/OnboardActivity.kt +++ b/app/src/main/java/com/woka/onboard/views/OnboardActivity.kt @@ -9,6 +9,8 @@ import androidx.navigation.NavOptions import androidx.navigation.fragment.NavHostFragment import com.woka.R import com.woka.WokaApp.Companion.userPrefs +import com.woka.database.helpers.ClicksHelper +import com.woka.database.models.clicks.ContentType import com.woka.onboard.fragments.GetCodeFragment.Companion.EMAIL_ARG import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16 import com.woka.onboard.fragments.SignUpFragment.Companion.ADD_CHILD_EVENT @@ -66,6 +68,13 @@ class OnboardActivity : WokaBaseActivity() { } } + @Suppress("DEPRECATION") + @Deprecated("Deprecated in Java") + override fun onBackPressed() { + super.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) + } + override fun onStart() { super.onStart() player?.start() diff --git a/app/src/main/java/com/woka/players/models/VideoPlayList.kt b/app/src/main/java/com/woka/players/models/VideoPlayList.kt index e98e3bc..fa923f2 100644 --- a/app/src/main/java/com/woka/players/models/VideoPlayList.kt +++ b/app/src/main/java/com/woka/players/models/VideoPlayList.kt @@ -7,5 +7,5 @@ import kotlinx.parcelize.Parcelize @Parcelize data class VideoPlayList( val playlist: ArrayList, - val videoViewRequestDataList: ArrayList? = null + val videoViewRequestDataList: MutableList ): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/woka/players/models/VideoViewRequestData.kt b/app/src/main/java/com/woka/players/models/VideoViewRequestData.kt index edba067..e98a561 100644 --- a/app/src/main/java/com/woka/players/models/VideoViewRequestData.kt +++ b/app/src/main/java/com/woka/players/models/VideoViewRequestData.kt @@ -1,12 +1,13 @@ package com.woka.players.models import android.os.Parcelable +import com.woka.database.models.clicks.ContentType import kotlinx.parcelize.Parcelize @Parcelize data class VideoViewRequestData( - val post_id: Int?, - val post_type: String, - var total_watched_duration: String? = null, - val category_id: String? = null + val id: Int?, + val contentType: ContentType, + val categoryId: String? = null, + var watchedDuration: String? = null ) : Parcelable diff --git a/app/src/main/java/com/woka/players/views/PlayerActivity.kt b/app/src/main/java/com/woka/players/views/PlayerActivity.kt index 15cadfc..85ae60c 100644 --- a/app/src/main/java/com/woka/players/views/PlayerActivity.kt +++ b/app/src/main/java/com/woka/players/views/PlayerActivity.kt @@ -4,6 +4,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkRequest import android.os.Bundle +import android.util.Log import android.view.ViewGroup import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity @@ -11,14 +12,19 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import com.jwplayer.pub.api.JWPlayer +import com.jwplayer.pub.api.PauseReason +import com.jwplayer.pub.api.PlayReason import com.jwplayer.pub.api.configuration.PlayerConfig import com.jwplayer.pub.api.events.EventType import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents import com.jwplayer.pub.api.fullscreen.FullscreenHandler +import com.woka.database.helpers.ClicksHelper +import com.woka.database.models.clicks.ContentType import com.woka.databinding.ActivityPlayerBinding import com.woka.players.KeepScreenOnHandler import com.woka.players.models.PlayBackState import com.woka.players.models.VideoPlayList +import com.woka.utils.TAG import com.woka.utils.hide import com.woka.utils.show @@ -96,10 +102,12 @@ class PlayerActivity : AppCompatActivity(), FullscreenHandler { binding.playerView.show() binding.errorView.hide() configAndPlay() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } closeBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } @@ -133,9 +141,37 @@ class PlayerActivity : AppCompatActivity(), FullscreenHandler { playbackState = PlayBackState.PLAY binding.playerView.show() binding.errorView.hide() + + if (it.playReason == PlayReason.INTERACTION){ + videoPlayList?.videoViewRequestDataList?.let {playlistData -> + if (playingIndex >= 0 && playingIndex < playlistData.size){ + with(playlistData[playingIndex]){ + ClicksHelper.upsertClickEvent( + contentType, + id, + categoryId + ) + } + } + } + } }) player.addListener(EventType.PAUSE, VideoPlayerEvents.OnPauseListener { playbackState = PlayBackState.PAUSED + + if (it.pauseReason == PauseReason.INTERACTION){ + videoPlayList?.videoViewRequestDataList?.let {playlistData -> + if (playingIndex >= 0 && playingIndex < playlistData.size){ + with(playlistData[playingIndex]){ + ClicksHelper.upsertClickEvent( + contentType, + id, + categoryId + ) + } + } + } + } }) player.addListener(EventType.ERROR, VideoPlayerEvents.OnErrorListener { if (player.position != 0.0){ @@ -148,6 +184,22 @@ class PlayerActivity : AppCompatActivity(), FullscreenHandler { player.addListener(EventType.PLAYLIST_ITEM, VideoPlayerEvents.OnPlaylistItemListener { playingIndex = it.index + + videoPlayList?.videoViewRequestDataList?.let {playlistData -> + if (playingIndex >= 0 && playingIndex < playlistData.size){ + with(playlistData[playingIndex]){ + ClicksHelper.upsertClickEvent( + contentType, + id, + categoryId + ) + } + } + } + }) + + player.addListener(EventType.SEEK, VideoPlayerEvents.OnSeekListener { + Log.d(TAG, "addListeners: ") }) (getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager).registerNetworkCallback( @@ -165,6 +217,7 @@ class PlayerActivity : AppCompatActivity(), FullscreenHandler { windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } override fun onAllowRotationChanged(allowRotation: Boolean) {} diff --git a/app/src/main/java/com/woka/shop/views/AddressActivity.kt b/app/src/main/java/com/woka/shop/views/AddressActivity.kt index 863b6e1..0701557 100644 --- a/app/src/main/java/com/woka/shop/views/AddressActivity.kt +++ b/app/src/main/java/com/woka/shop/views/AddressActivity.kt @@ -51,6 +51,7 @@ class AddressActivity : WokaBaseActivity() { binding.apply { toolbar.backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } diff --git a/app/src/main/java/com/woka/shop/views/CartActivity.kt b/app/src/main/java/com/woka/shop/views/CartActivity.kt index 49e1720..fdd0547 100644 --- a/app/src/main/java/com/woka/shop/views/CartActivity.kt +++ b/app/src/main/java/com/woka/shop/views/CartActivity.kt @@ -39,6 +39,7 @@ class CartActivity : WokaBaseActivity() { setObservers() } + @Suppress("DEPRECATION") @Deprecated("Deprecated in Java") override fun onBackPressed() { super.onBackPressed() @@ -49,6 +50,7 @@ class CartActivity : WokaBaseActivity() { binding.apply { toolbar.backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } } } diff --git a/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt b/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt index b1ac3c7..2acc397 100644 --- a/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt +++ b/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt @@ -99,6 +99,7 @@ class MyOrdersActivity : WokaBaseActivity() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } cart.setOnClickListener { diff --git a/app/src/main/java/com/woka/shop/views/ShopActivity.kt b/app/src/main/java/com/woka/shop/views/ShopActivity.kt index d94f285..77ab57a 100644 --- a/app/src/main/java/com/woka/shop/views/ShopActivity.kt +++ b/app/src/main/java/com/woka/shop/views/ShopActivity.kt @@ -74,6 +74,7 @@ class ShopActivity : WokaBaseActivity() { binding.apply { backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } cart.setOnClickListener { diff --git a/app/src/main/java/com/woka/userdata/UserApiService.kt b/app/src/main/java/com/woka/userdata/UserApiService.kt index b940d2f..408f9f7 100644 --- a/app/src/main/java/com/woka/userdata/UserApiService.kt +++ b/app/src/main/java/com/woka/userdata/UserApiService.kt @@ -27,6 +27,6 @@ interface UserApiService { @GET("get_user_notifications") suspend fun getNotifications(): Response>> - @POST("favourite_listing") + @POST("v2/favourite_listing") suspend fun getMyFavList(@Body formBody: FormBody): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/woka/utils/Constants.kt b/app/src/main/java/com/woka/utils/Constants.kt index d866c39..654f725 100644 --- a/app/src/main/java/com/woka/utils/Constants.kt +++ b/app/src/main/java/com/woka/utils/Constants.kt @@ -19,5 +19,15 @@ const val TERMS_N_CONDITIONS_URL = "https://www.wokaland.com/terms/" const val PRIVACY_N_POLICY_URL = "https://www.wokaland.com/privacy-policy/" // other urls +const val PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.woka" -const val PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=com.woka" \ No newline at end of file +// JW Player +const val JW_PLAYER_LICENSE = "LkYoNusv+gSIVJIrXa5Bf59iBNlUMxeg82PM/l8JWk+cD4BE" + +// one signal +const val ONESIGNAL_APP_ID = "f9674e6f-75fb-49e8-8379-4f2ed2a880b8" + +// analytics constants +const val ANALYTICS_GUEST_LOGIN = "guest_login_android" +const val ANALYTICS_USER_SIGN_UP = "user_signup_android" +const val ANALYTICS_NEW_USER = "new_user_android" \ No newline at end of file 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 a3afedb..f6ee583 100644 --- a/app/src/main/java/com/woka/webseries/viewmodel/WebSeriesViewModel.kt +++ b/app/src/main/java/com/woka/webseries/viewmodel/WebSeriesViewModel.kt @@ -5,9 +5,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jwplayer.pub.api.media.playlists.PlaylistItem +import com.woka.database.models.clicks.ContentType import com.woka.modules.categorymodels.CategoriesResponse import com.woka.networking.ApiResult import com.woka.players.models.VideoPlayList +import com.woka.players.models.VideoViewRequestData import com.woka.utils.PagingData import com.woka.webseries.WebSeriesRepository import com.woka.webseries.models.ContinueEpisodeResponse @@ -265,6 +267,13 @@ class WebSeriesViewModel : ViewModel() { .image(episode.thumbnail_path) .build() ) + + currentPlayListHin.videoViewRequestDataList.add( + VideoViewRequestData( + episode.id, + ContentType.EPISODE + ) + ) } } @@ -276,6 +285,13 @@ class WebSeriesViewModel : ViewModel() { .image(episode.thumbnail_path) .build() ) + + currentPlayListEng.videoViewRequestDataList.add( + VideoViewRequestData( + episode.id, + ContentType.EPISODE + ) + ) } } } @@ -358,6 +374,13 @@ class WebSeriesViewModel : ViewModel() { .image(teaser.thumbnail_path) .build() ) + + currentPlayListHin.videoViewRequestDataList.add( + VideoViewRequestData( + teaser.id, + ContentType.TEASER + ) + ) } } @@ -369,6 +392,13 @@ class WebSeriesViewModel : ViewModel() { .image(teaser.thumbnail_path) .build() ) + + currentPlayListEng.videoViewRequestDataList.add( + VideoViewRequestData( + teaser.id, + ContentType.TEASER + ) + ) } } } 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 6c169fc..7ee9a6f 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 @@ -106,6 +106,8 @@ class WebSeriesFragment : Fragment() { binding.apply { toolbar.backBtn.setOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() + + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } retryBtn.setOnClickListener { @@ -141,7 +143,12 @@ class WebSeriesFragment : Fragment() { .build() ) }, - null + mutableListOf( + VideoViewRequestData( + 0, + ContentType.TEASER + ) + ) ) ) putExtra(EXTRA_PLAY_INDEX, 0) @@ -442,12 +449,11 @@ class WebSeriesFragment : Fragment() { .build() ) - videoPlayList.videoViewRequestDataList?.add( + videoPlayList.videoViewRequestDataList.add( VideoViewRequestData( episodeData.id, - "3", - null, - category_id = "18" + ContentType.EPISODE, + "18" ) ) @@ -461,11 +467,10 @@ class WebSeriesFragment : Fragment() { .build() ) - videoPlayList.videoViewRequestDataList?.add( + videoPlayList.videoViewRequestDataList.add( VideoViewRequestData( episodeData.id, - "3", - null, + ContentType.EPISODE, "1" ) ) 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 786df40..07c3e18 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 @@ -27,6 +27,7 @@ import com.woka.databinding.DialogEpisodeBinding import com.woka.databinding.FragmentWebShowBinding import com.woka.networking.ApiResult import com.woka.players.models.VideoPlayList +import com.woka.players.models.VideoViewRequestData import com.woka.players.views.PlayerActivity import com.woka.userPreference.UserType import com.woka.utils.NoSignInDialog @@ -160,6 +161,8 @@ class WebShowFragment : Fragment(), TabLayout.OnTabSelectedListener { binding.apply { backBtn.setOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() + + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } watchCard.setOnClickListener { @@ -265,8 +268,6 @@ class WebShowFragment : Fragment(), TabLayout.OnTabSelectedListener { seasonData.season_more_details?.let { moreDetailsList -> if (moreDetailsList.isNotEmpty()) { - val videoPlayList = VideoPlayList(ArrayList()) - val playlistItem = PlaylistItem.Builder() if (categoryId == "18" && moreDetailsList.size > 1) { @@ -283,6 +284,12 @@ class WebShowFragment : Fragment(), TabLayout.OnTabSelectedListener { } } + val videoPlayList = VideoPlayList(ArrayList(), mutableListOf( + VideoViewRequestData( + seasonData.id, + ContentType.SEASON + ) + )) videoPlayList.playlist.add(playlistItem.build()) activity?.let { diff --git a/app/src/main/java/com/woka/wokagames/playerr/GamePlayerActivity.kt b/app/src/main/java/com/woka/wokagames/playerr/GamePlayerActivity.kt index a7be596..7140692 100644 --- a/app/src/main/java/com/woka/wokagames/playerr/GamePlayerActivity.kt +++ b/app/src/main/java/com/woka/wokagames/playerr/GamePlayerActivity.kt @@ -4,12 +4,15 @@ import android.annotation.SuppressLint import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle +import android.view.MotionEvent import android.view.WindowManager import android.webkit.WebSettings import android.webkit.WebViewClient import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import com.woka.R +import com.woka.database.helpers.ClicksHelper +import com.woka.database.models.clicks.ContentType import com.woka.databinding.ActivityGamePlayerBinding import com.woka.utils.DecisionDialog import com.woka.utils.WokaBaseActivity @@ -25,6 +28,9 @@ class GamePlayerActivity : WokaBaseActivity() { private var gamePlayerData: GamePlayerData? = null + private var clicksCount = 0 + + @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityGamePlayerBinding.inflate(layoutInflater) @@ -49,6 +55,13 @@ class GamePlayerActivity : WokaBaseActivity() { } initWebView(it.gameUrl) } + + binding.webView.setOnTouchListener { _, event -> + if (event.action == MotionEvent.ACTION_DOWN){ + clicksCount++ + } + return@setOnTouchListener false + } } override fun onStart() { @@ -74,6 +87,8 @@ class GamePlayerActivity : WokaBaseActivity() { override fun onDestroy() { super.onDestroy() binding.webView.destroy() + + ClicksHelper.upsertClickEvent(ContentType.GAME, gamePlayerData?.id, null, clicksCount) } @SuppressLint("SetJavaScriptEnabled") diff --git a/app/src/main/java/com/woka/wokagames/playerr/GamePlayerData.kt b/app/src/main/java/com/woka/wokagames/playerr/GamePlayerData.kt index db3b917..d9b15cf 100644 --- a/app/src/main/java/com/woka/wokagames/playerr/GamePlayerData.kt +++ b/app/src/main/java/com/woka/wokagames/playerr/GamePlayerData.kt @@ -5,6 +5,7 @@ import kotlinx.parcelize.Parcelize @Parcelize data class GamePlayerData( + val id: Int?, val gameUrl: String, val landscape: Boolean = false ): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/woka/wokagames/views/GamesActivity.kt b/app/src/main/java/com/woka/wokagames/views/GamesActivity.kt index 49cd176..90fa153 100644 --- a/app/src/main/java/com/woka/wokagames/views/GamesActivity.kt +++ b/app/src/main/java/com/woka/wokagames/views/GamesActivity.kt @@ -95,8 +95,10 @@ class GamesActivity : WokaBaseActivity() { } } - override fun onDestroy() { - super.onDestroy() + @Suppress("DEPRECATION") + @Deprecated("Deprecated in Java") + override fun onBackPressed() { + super.onBackPressed() ClicksHelper.upsertClickEvent(ContentType.OTHERS) } @@ -143,6 +145,7 @@ class GamesActivity : WokaBaseActivity() { binding.apply { toolbar.backBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() + ClicksHelper.upsertClickEvent(ContentType.OTHERS) } retryBtn.setOnClickListener { @@ -190,7 +193,7 @@ class GamesActivity : WokaBaseActivity() { trailerBtn.setOnClickListener { gameData.game_url?.let { startActivity(Intent(this@GamesActivity, GamePlayerActivity::class.java).apply { - putExtra(EXTRA_GAME_PLAYER_DATA, GamePlayerData(it, gameData.screen_orientation == "Landscape")) + putExtra(EXTRA_GAME_PLAYER_DATA, GamePlayerData(gameData.id, it, gameData.screen_orientation == "Landscape")) }) } @@ -271,7 +274,7 @@ class GamesActivity : WokaBaseActivity() { watchCard.setOnClickListener { gameData.game_url?.let { startActivity(Intent(this@GamesActivity, GamePlayerActivity::class.java).apply { - putExtra(EXTRA_GAME_PLAYER_DATA, GamePlayerData(it, gameData.screen_orientation == "Landscape")) + putExtra(EXTRA_GAME_PLAYER_DATA, GamePlayerData(gameData.id, it, gameData.screen_orientation == "Landscape")) }) } diff --git a/build.gradle b/build.gradle index 7c27f8a..404b025 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,10 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + dependencies { + classpath libs.google.services + classpath libs.gradle + classpath libs.perf.plugin + } +}// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { alias(libs.plugins.androidApplication) apply false alias(libs.plugins.jetbrainsKotlinAndroid) apply false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1e539ae..7ba78cf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,9 +12,15 @@ constraintlayout = "2.1.4" navigationFragmentKtx = "2.7.7" navigationUiKtx = "2.7.7" navigationSafeArgs = "2.7.7" +onesignal = "5.1.20" roomKtx = "2.6.1" roomRuntime = "2.6.1" ksp = "2.0.0-1.0.24" +googleServices = "4.4.2" +firebaseAnalytics = "22.0.2" +firebasePerf = "21.0.1" +gradle = "8.1.0" +perfPlugin = "1.4.2" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -28,7 +34,13 @@ 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" } +onesignal = { module = "com.onesignal:OneSignal", version.ref = "onesignal" } room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomKtx" } +google-services = { group = "com.google.gms", name = "google-services", version.ref = "googleServices" } +firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics", version.ref = "firebaseAnalytics" } +firebase-perf = { group = "com.google.firebase", name = "firebase-perf", version.ref = "firebasePerf" } +gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } +perf-plugin = { group = "com.google.firebase", name = "perf-plugin", version.ref = "perfPlugin" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }