Integrated forgot_username api and completed ui flow and created new

Integrated app version history api and created new ui for new updates.
Implemented logic for new and force version checks.

Loaded continue watching data for karaoke and audio after coming back from player activity.

Resolved client bugs :
1. Improvements in live tv floating view on homefragment1 and bottom nav icons.
2. FmActivity volume icons changes.
3. Shared other remarks.
4. directly load product details upon only 1 product in category.
This commit is contained in:
2024-08-20 20:53:17 +05:30
parent df34a2ee9d
commit 812d8c19c1
59 changed files with 790 additions and 138 deletions

View File

@@ -9,6 +9,8 @@ import android.os.Bundle
import android.text.Html import android.text.Html
import android.view.WindowManager import android.view.WindowManager
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -58,6 +60,8 @@ class AudioBooksActivity : WokaBaseActivity() {
private lateinit var noSignInDialog: NoSignInDialog private lateinit var noSignInDialog: NoSignInDialog
private lateinit var playerLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
@@ -87,6 +91,8 @@ class AudioBooksActivity : WokaBaseActivity() {
noSignInDialog = NoSignInDialog(this) noSignInDialog = NoSignInDialog(this)
initLaunchers()
initViews() initViews()
initAudioDialog() initAudioDialog()
@@ -107,6 +113,15 @@ class AudioBooksActivity : WokaBaseActivity() {
ClicksHelper.upsertClickEvent(ContentType.OTHERS) ClicksHelper.upsertClickEvent(ContentType.OTHERS)
} }
private fun initLaunchers() {
playerLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (userPrefs?.userType != UserType.GUEST){
viewModel.loadContinueData()
}
}
}
private fun initViews() { private fun initViews() {
binding.apply { binding.apply {
adjustTrailerImage() adjustTrailerImage()
@@ -364,27 +379,29 @@ class AudioBooksActivity : WokaBaseActivity() {
} }
url?.let { url?.let {
startActivity(Intent(this, PlayerActivity::class.java).apply { playerLauncher.launch(
putExtra( Intent(this, PlayerActivity::class.java).apply {
PlayerActivity.EXTRA_PLAY_LIST, putExtra(
VideoPlayList( PlayerActivity.EXTRA_PLAY_LIST,
ArrayList<PlaylistItem>().apply { VideoPlayList(
add( ArrayList<PlaylistItem>().apply {
PlaylistItem.Builder() add(
.file(it) PlaylistItem.Builder()
.image(it) .file(it)
.title(title) .image(it)
.build() .title(title)
) .build()
}, )
mutableListOf(VideoViewData( },
audioBookData.id, mutableListOf(VideoViewData(
ContentType.AUDIO audioBookData.id,
)) ContentType.AUDIO
))
)
) )
) putExtra(PlayerActivity.EXTRA_PLAY_INDEX, 0)
putExtra(PlayerActivity.EXTRA_PLAY_INDEX, 0) }
}) )
} }
} }

View File

@@ -1,7 +1,6 @@
package com.woka.karaoke package com.woka.karaoke
import com.woka.home.mylist.MyListRepository import com.woka.home.mylist.MyListRepository
import com.woka.home.mylist.models.FavKaraokeData
import com.woka.home.mylist.models.PostType import com.woka.home.mylist.models.PostType
import com.woka.karaoke.models.continuesing.ContinueKaraokeResponse import com.woka.karaoke.models.continuesing.ContinueKaraokeResponse
import com.woka.karaoke.models.listing.KaraokeData import com.woka.karaoke.models.listing.KaraokeData
@@ -14,7 +13,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import okhttp3.FormBody import okhttp3.FormBody
import kotlin.math.max
object KaraokeRepository { object KaraokeRepository {

View File

@@ -10,6 +10,8 @@ import android.os.Bundle
import android.text.Html import android.text.Html
import android.view.WindowManager import android.view.WindowManager
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -58,6 +60,8 @@ class KaraokeActivity : WokaBaseActivity() {
private lateinit var karaokeDialog: Dialog private lateinit var karaokeDialog: Dialog
private lateinit var noSignInDialog: NoSignInDialog private lateinit var noSignInDialog: NoSignInDialog
private lateinit var playerLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = ActivityKaraokeBinding.inflate(layoutInflater) binding = ActivityKaraokeBinding.inflate(layoutInflater)
@@ -89,6 +93,8 @@ class KaraokeActivity : WokaBaseActivity() {
noSignInDialog = NoSignInDialog(this) noSignInDialog = NoSignInDialog(this)
initLaunchers()
initViews() initViews()
initKaraokeDialog() initKaraokeDialog()
@@ -109,6 +115,15 @@ class KaraokeActivity : WokaBaseActivity() {
ClicksHelper.upsertClickEvent(ContentType.OTHERS) ClicksHelper.upsertClickEvent(ContentType.OTHERS)
} }
private fun initLaunchers() {
playerLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (userPrefs?.userType != UserType.GUEST){
viewModel.loadContinueData()
}
}
}
private fun initViews() { private fun initViews() {
binding.apply { binding.apply {
adjustTrailerImage() adjustTrailerImage()
@@ -207,21 +222,36 @@ class KaraokeActivity : WokaBaseActivity() {
private fun onSingClicked(karaokeData: KaraokeData) { private fun onSingClicked(karaokeData: KaraokeData) {
karaokeData.content_more_details?.let { moreDetailsList -> karaokeData.content_more_details?.let { moreDetailsList ->
if (moreDetailsList.isNotEmpty()){ if (moreDetailsList.isNotEmpty()) {
if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1){ if (userPrefs?.appLanguage == "hi" && moreDetailsList.size > 1) {
moreDetailsList[1]?.let {data -> moreDetailsList[1]?.let { data ->
data.video_url_hd?.let { data.video_url_hd?.let {
startActivity(Intent(this@KaraokeActivity, KaraokePlayerActivity::class.java).apply { playerLauncher.launch(
putExtra(EXTRA_KARAOKE_DATA, KaraokePlayerData(it, karaokeData.title, karaokeData.id)) Intent(
}) this@KaraokeActivity,
KaraokePlayerActivity::class.java
).apply {
putExtra(
EXTRA_KARAOKE_DATA,
KaraokePlayerData(it, karaokeData.title, karaokeData.id)
)
})
} }
} }
}else{ } else {
moreDetailsList[0]?.let {data -> moreDetailsList[0]?.let { data ->
data.video_url_hd?.let { data.video_url_hd?.let {
startActivity(Intent(this@KaraokeActivity, KaraokePlayerActivity::class.java).apply { playerLauncher.launch(
putExtra(EXTRA_KARAOKE_DATA, KaraokePlayerData(it, karaokeData.title, karaokeData.id)) Intent(
}) this@KaraokeActivity,
KaraokePlayerActivity::class.java
).apply {
putExtra(
EXTRA_KARAOKE_DATA,
KaraokePlayerData(it, karaokeData.title, karaokeData.id)
)
}
)
} }
} }
} }

View File

@@ -23,10 +23,12 @@ class ChildAdapter(private val childList: List<Child>) : RecyclerView.Adapter<Ch
override fun onBindViewHolder(holder: ChildViewHolder, position: Int) { override fun onBindViewHolder(holder: ChildViewHolder, position: Int) {
holder.binding.apply { holder.binding.apply {
Glide.with(image) if (childList[position].avtar != null){
.load(childList[position].avtar) Glide.with(image)
.fitCenter() .load(childList[position].avtar)
.into(image) .fitCenter()
.into(image)
}
name.text = childList[position].username name.text = childList[position].username
} }

View File

@@ -1,10 +1,11 @@
package com.woka.onboard.fragments package com.woka.onboard.fragments
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.woka.R import com.woka.R
@@ -13,6 +14,7 @@ import com.woka.database.models.ContentType
import com.woka.databinding.FragmentChildListBinding import com.woka.databinding.FragmentChildListBinding
import com.woka.onboard.adapters.ChildAdapter import com.woka.onboard.adapters.ChildAdapter
import com.woka.onboard.fragments.GetCodeFragment.Companion.EMAIL_ARG import com.woka.onboard.fragments.GetCodeFragment.Companion.EMAIL_ARG
import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_FORGOT_USER_NAME
import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16 import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16
import com.woka.onboard.mvvm.OnboardViewModel import com.woka.onboard.mvvm.OnboardViewModel
@@ -24,11 +26,14 @@ class ChildListFragment : Fragment() {
private var isUnder16: Boolean = false private var isUnder16: Boolean = false
private var email: String = "" private var email: String = ""
private var isForgotUsername = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
arguments?.let { arguments?.let {
isUnder16 = it.getBoolean(IS_UNDER_16) isUnder16 = it.getBoolean(IS_UNDER_16)
email = it.getString(EMAIL_ARG, "") email = it.getString(EMAIL_ARG, "")
isForgotUsername = it.getBoolean(IS_FORGOT_USER_NAME, false)
} }
} }
@@ -41,17 +46,47 @@ class ChildListFragment : Fragment() {
viewModel = ViewModelProvider(it)[OnboardViewModel::class.java] viewModel = ViewModelProvider(it)[OnboardViewModel::class.java]
} }
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true){
override fun handleOnBackPressed() {
viewModel.clearForgotUsernameData()
findNavController().popBackStack()
}
})
initViews()
clickEvents() clickEvents()
return binding.root return binding.root
} }
private fun initViews() {
binding.apply {
if (isForgotUsername){
next.text = getString(R.string.go_to_login)
title.text = getString(R.string.username_found)
subTitle.text = getString(R.string.user_name_linked_to_your_account)
}
}
}
private fun clickEvents() { private fun clickEvents() {
binding.apply { binding.apply {
next.setOnClickListener { next.setOnClickListener {
gotoSignUpFragment() if (isForgotUsername){
viewModel.clearForgotUsernameData()
findNavController().popBackStack(R.id.signInFragment, false)
}else{
gotoSignUpFragment()
}
ClicksHelper.upsertClickEvent(ContentType.OTHERS) ClicksHelper.upsertClickEvent(ContentType.OTHERS)
} }
backBtn.setOnClickListener {
activity?.onBackPressedDispatcher?.onBackPressed()
}
} }
} }
@@ -64,7 +99,9 @@ class ChildListFragment : Fragment() {
} }
binding.apply { binding.apply {
rvChild.adapter = ChildAdapter(viewModel.childList!!) viewModel.childList?.let {
rvChild.adapter = ChildAdapter(it)
}
} }
} }

View File

@@ -6,6 +6,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ArrayAdapter
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
@@ -20,6 +21,7 @@ import com.woka.onboard.mvvm.OnboardViewModel
import com.woka.utils.CHILD_TYPE import com.woka.utils.CHILD_TYPE
import com.woka.utils.PARENT_TYPE import com.woka.utils.PARENT_TYPE
import com.woka.utils.ProgressView import com.woka.utils.ProgressView
import com.woka.utils.show
import com.woka.utils.toast import com.woka.utils.toast
/* /*
@@ -34,6 +36,7 @@ class GetEmailFragment : Fragment() {
companion object { companion object {
const val IS_UNDER_16 = "is_under_16" const val IS_UNDER_16 = "is_under_16"
const val IS_RESET_PASSWORD_INTENT = "reset_password_intent" const val IS_RESET_PASSWORD_INTENT = "reset_password_intent"
const val IS_FORGOT_USER_NAME = "forgot_user_name"
} }
private lateinit var binding: FragmentGetEmailBinding private lateinit var binding: FragmentGetEmailBinding
@@ -43,12 +46,14 @@ class GetEmailFragment : Fragment() {
private var isUnder16: Boolean = false private var isUnder16: Boolean = false
private var isResetPasswordIntent: Boolean = false private var isResetPasswordIntent: Boolean = false
private var isForgotUserName: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
arguments?.let { arguments?.let {
isUnder16 = it.getBoolean(IS_UNDER_16, false) isUnder16 = it.getBoolean(IS_UNDER_16, false)
isResetPasswordIntent = it.getBoolean(IS_RESET_PASSWORD_INTENT, false) isResetPasswordIntent = it.getBoolean(IS_RESET_PASSWORD_INTENT, false)
isForgotUserName = it.getBoolean(IS_FORGOT_USER_NAME, false)
} }
} }
@@ -153,6 +158,33 @@ class GetEmailFragment : Fragment() {
null -> {} null -> {}
} }
} }
viewModel.forgotUsernameLiveData.observe(viewLifecycleOwner){
when (it) {
is ApiResult.Error -> {
progressView.hide()
toast(it.errorMessage)
}
is ApiResult.Loading -> {
progressView.show(getString(R.string.please_wait))
}
is ApiResult.Success -> {
progressView.hide()
viewModel.childList = it.data
findNavController().navigate(
R.id.action_getEmailFragment_to_childListFragment,
Bundle().apply {
putBoolean(IS_FORGOT_USER_NAME, true)
}
)
}
null -> {}
}
}
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -165,7 +197,20 @@ class GetEmailFragment : Fragment() {
private fun initViews() { private fun initViews() {
binding.apply { binding.apply {
if (isResetPasswordIntent) { if (isForgotUserName){
ArrayAdapter.createFromResource(
requireContext(),
R.array.user_type_selection,
android.R.layout.simple_spinner_item
).also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
userTypeSpinner.adapter = adapter
}
title.text = getString(R.string.forgot_user_name)
userTypeSelectionView.show()
}
else if (isResetPasswordIntent) {
// scenario 3 // scenario 3
title.text = getString(R.string.forgot_your_password) title.text = getString(R.string.forgot_your_password)
@@ -203,7 +248,17 @@ class GetEmailFragment : Fragment() {
} }
} }
if (isResetPasswordIntent){ if (isForgotUserName){
if (binding.userTypeSpinner.selectedItemPosition < 1){
toast(getString(R.string.please_select_a_user_type))
return@setOnClickListener
}
}
if (isForgotUserName){
viewModel.forgotUsername(if (binding.userTypeSpinner.selectedItemPosition == 1) "2" else "1", binding.email.text.toString())
}
else if (isResetPasswordIntent){
// we are taking username from the same input box of email // we are taking username from the same input box of email
viewModel.forgotPwdSendOTP(binding.email.text.toString()) viewModel.forgotPwdSendOTP(binding.email.text.toString())
} else if (!isUnder16) { } else if (!isUnder16) {

View File

@@ -0,0 +1,42 @@
package com.woka.onboard.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import com.woka.BuildConfig
import com.woka.databinding.FragmentNewUpdateBinding
import com.woka.utils.setVisibility
class NewUpdateFragment : Fragment() {
private lateinit var binding: FragmentNewUpdateBinding
private val args: NewUpdateFragmentArgs by navArgs()
private val forceNewVersion by lazy { args.forceNewVersion }
private val currentVersion by lazy { BuildConfig.VERSION_CODE }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentNewUpdateBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews()
}
private fun initViews(){
binding.apply {
skip.setVisibility(currentVersion >= forceNewVersion)
}
}
}

View File

@@ -19,6 +19,7 @@ import com.woka.database.models.ContentType
import com.woka.databinding.FragmentSignInBinding import com.woka.databinding.FragmentSignInBinding
import com.woka.home.views.HomeActivity import com.woka.home.views.HomeActivity
import com.woka.networking.ApiResult import com.woka.networking.ApiResult
import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_FORGOT_USER_NAME
import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_RESET_PASSWORD_INTENT import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_RESET_PASSWORD_INTENT
import com.woka.onboard.mvvm.OnboardViewModel import com.woka.onboard.mvvm.OnboardViewModel
import com.woka.userPreference.UserType import com.woka.userPreference.UserType
@@ -200,6 +201,15 @@ class SignInFragment : Fragment() {
ClicksHelper.upsertClickEvent(ContentType.OTHERS) ClicksHelper.upsertClickEvent(ContentType.OTHERS)
} }
forgotUserName.setOnClickListener {
findNavController().navigate(R.id.action_signInFragment_to_getEmailFragment,
Bundle().apply {
putBoolean(IS_FORGOT_USER_NAME, true)
})
ClicksHelper.upsertClickEvent(ContentType.OTHERS)
}
backBtn.setOnClickListener { backBtn.setOnClickListener {
activity?.onBackPressedDispatcher?.onBackPressed() activity?.onBackPressedDispatcher?.onBackPressed()
ClicksHelper.upsertClickEvent(ContentType.OTHERS) ClicksHelper.upsertClickEvent(ContentType.OTHERS)

View File

@@ -8,17 +8,25 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.woka.BuildConfig
import com.woka.R import com.woka.R
import com.woka.WokaApp.Companion.userPrefs import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.FragmentSplashBinding import com.woka.databinding.FragmentSplashBinding
import com.woka.home.views.HomeActivity import com.woka.home.views.HomeActivity
import com.woka.userdata.userDataModels.UserDataResponse
import com.woka.networking.ApiResult import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper
import com.woka.onboard.models.appupdate.VersionHistoryResponseData
import com.woka.onboard.mvvm.OnboardApiService
import com.woka.onboard.mvvm.OnboardRepository
import com.woka.streamingurls.StreamingUrlRepository
import com.woka.userPreference.UserType import com.woka.userPreference.UserType
import com.woka.userdata.userDataModels.UserDataResponse
import com.woka.utils.hide import com.woka.utils.hide
import com.woka.utils.show import com.woka.utils.show
import com.woka.utils.toast import com.woka.utils.toast
@@ -30,10 +38,16 @@ import kotlinx.coroutines.launch
*/ */
class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> { class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
private lateinit var binding: FragmentSplashBinding private val onboardRepository =
OnboardRepository(RetrofitHelper.getRetrofit().create(OnboardApiService::class.java))
private lateinit var binding: FragmentSplashBinding
private var player: MediaPlayer? = null private var player: MediaPlayer? = null
private val _versionHistoryLiveData = MutableLiveData<ApiResult<VersionHistoryResponseData>>()
private val versionHistoryLiveData: LiveData<ApiResult<VersionHistoryResponseData>>
get() = _versionHistoryLiveData
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@@ -49,7 +63,9 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
animateLogo() animateLogo()
if (userPrefs?.userType == UserType.CHILD || userPrefs?.userType == UserType.GUARDIAN){ loadVersionHistory()
if (userPrefs?.userType == UserType.CHILD || userPrefs?.userType == UserType.GUARDIAN) {
// some type of user is logged in // some type of user is logged in
// thus, loading data // thus, loading data
userPrefs?.loadUserData() userPrefs?.loadUserData()
@@ -63,7 +79,18 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
retryBtn.setOnClickListener { retryBtn.setOnClickListener {
retryBtn.hide() retryBtn.hide()
progressBar.show() progressBar.show()
userPrefs?.loadUserData()
if (_versionHistoryLiveData.value !is ApiResult.Success) {
loadVersionHistory()
}
if (userPrefs?.userType == UserType.CHILD || userPrefs?.userType == UserType.GUARDIAN) {
if (userPrefs?.userData == null) {
userPrefs?.loadUserData()
}
}
StreamingUrlRepository.loadLiveStreamingUrls()
} }
} }
} }
@@ -76,21 +103,15 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
private fun animateLogo() { private fun animateLogo() {
binding.logo.animate().scaleXBy(1f).scaleYBy(1f) binding.logo.animate().scaleXBy(1f).scaleYBy(1f)
.setDuration(2000) .setDuration(2000)
.setListener(object : Animator.AnimatorListener{ .setListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {} override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch { lifecycleScope.launch {
delay(2000) delay(2000)
if (userPrefs?.userType == UserType.NONE || userPrefs?.userType == UserType.GUEST){ listenVersionHistory()
// no user or guest is logged in
goForward()
}else{
// some user is logged in listening to user data
userPrefs?.userLiveData?.removeObserver(this@SplashFragment)
userPrefs?.userLiveData?.observe(viewLifecycleOwner, this@SplashFragment)
}
} }
} }
override fun onAnimationCancel(animation: Animator) {} override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {} override fun onAnimationRepeat(animation: Animator) {}
@@ -105,18 +126,70 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
player = null player = null
} }
private fun goForward(){ private fun loadVersionHistory() {
if (userPrefs?.userType == UserType.NONE){ lifecycleScope.launch {
_versionHistoryLiveData.postValue(ApiResult.Loading())
_versionHistoryLiveData.postValue(onboardRepository.versionHistory())
}
}
private fun listenVersionHistory() {
versionHistoryLiveData.observe(viewLifecycleOwner) {
when (it) {
is ApiResult.Error -> {
toast(it.errorMessage)
binding.progressBar.hide()
binding.retryBtn.show()
}
is ApiResult.Loading -> {
binding.progressBar.show()
binding.retryBtn.hide()
}
is ApiResult.Success -> {
it.data?.`0`?.new_version?.let { newVersion ->
if (BuildConfig.VERSION_CODE < newVersion) {
// a new update is available
// to be implemented
it.data.`0`.force_update_version?.let { forceVersion ->
findNavController().navigate(SplashFragmentDirections.actionSplashFragmentToNewUpdateFragment(1))
}
} else {
// no new update available
if (userPrefs?.userType == UserType.NONE || userPrefs?.userType == UserType.GUEST) {
// no user or guest is logged in
goForward()
} else {
// some user is logged in listening to user data
userPrefs?.userLiveData?.removeObserver(this@SplashFragment)
userPrefs?.userLiveData?.observe(
viewLifecycleOwner,
this@SplashFragment
)
}
}
}
}
}
}
}
private fun goForward() {
if (userPrefs?.userType == UserType.NONE) {
// none of the user is logged in // none of the user is logged in
// going through normal onboard process // going through normal onboard process
try { try {
val extras = FragmentNavigatorExtras(binding.logo to "logo") val extras = FragmentNavigatorExtras(binding.logo to "logo")
findNavController().navigate(R.id.action_splashFragment_to_languageFragment, findNavController().navigate(
null, null, extras) R.id.action_splashFragment_to_languageFragment,
null, null, extras
)
} catch (e: Exception) { } catch (e: Exception) {
// do nothing // do nothing
} }
}else{ } else {
// going to home activity as any of the user is logged in // going to home activity as any of the user is logged in
activity?.let { activity?.let {
startActivity(Intent(it, HomeActivity::class.java).apply { startActivity(Intent(it, HomeActivity::class.java).apply {
@@ -129,12 +202,13 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
override fun onChanged(value: ApiResult<UserDataResponse>?) { override fun onChanged(value: ApiResult<UserDataResponse>?) {
// on user data loaded // on user data loaded
when (value){ when (value) {
is ApiResult.Error -> { is ApiResult.Error -> {
toast(value.errorMessage) toast(value.errorMessage)
binding.retryBtn.show() binding.retryBtn.show()
binding.progressBar.hide() binding.progressBar.hide()
} }
is ApiResult.Loading -> {} is ApiResult.Loading -> {}
is ApiResult.Success -> { is ApiResult.Success -> {
binding.retryBtn.hide() binding.retryBtn.hide()

View File

@@ -1,8 +1,8 @@
package com.woka.onboard.models package com.woka.onboard.models
data class Child( data class Child(
val avtar: String, val avtar: String?,
val fullname: String, val fullname: String?,
val id: Int, val id: Int?,
val username: String val username: String?
) )

View File

@@ -0,0 +1,12 @@
package com.woka.onboard.models.appupdate
data class VersionData(
val force_update: Int?,
val force_update_version: Int?,
val id: Int?,
val new_version: Int?,
val old_version: Int?,
val release_date: String?,
val release_notes: String?,
val version_id: String?
)

View File

@@ -0,0 +1,7 @@
package com.woka.onboard.models.appupdate
data class VersionHistoryResponseData(
val `0`: VersionData?,
val msg: String?,
val url: String?
)

View File

@@ -2,6 +2,7 @@ package com.woka.onboard.mvvm
import com.woka.networking.ApiResponse import com.woka.networking.ApiResponse
import com.woka.onboard.models.AvatarList import com.woka.onboard.models.AvatarList
import com.woka.onboard.models.Child
import com.woka.onboard.models.ChildListResponse import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse import com.woka.onboard.models.ForgotPasswrodOTPResponse
import com.woka.onboard.models.Guest import com.woka.onboard.models.Guest
@@ -10,11 +11,13 @@ import com.woka.onboard.models.LoginResponse
import com.woka.onboard.models.RegisterRequestData import com.woka.onboard.models.RegisterRequestData
import com.woka.onboard.models.RegisterResponse import com.woka.onboard.models.RegisterResponse
import com.woka.onboard.models.VerifyEmail import com.woka.onboard.models.VerifyEmail
import com.woka.onboard.models.appupdate.VersionHistoryResponseData
import okhttp3.FormBody import okhttp3.FormBody
import retrofit2.Response import retrofit2.Response
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.POST import retrofit2.http.POST
import retrofit2.http.Query
interface OnboardApiService { interface OnboardApiService {
@@ -60,4 +63,11 @@ interface OnboardApiService {
@POST("guest_login") @POST("guest_login")
suspend fun guestLogin(@Body body: FormBody): Response<ApiResponse<Guest>> suspend fun guestLogin(@Body body: FormBody): Response<ApiResponse<Guest>>
@POST("forgot_username")
suspend fun forgotUsername(@Body body: FormBody): Response<ApiResponse<List<Child>>>
@GET("version_history")
suspend fun versionHistory(@Query("device") deviceId: Int): Response<ApiResponse<VersionHistoryResponseData>>
} }

View File

@@ -5,6 +5,7 @@ import com.woka.WokaApp
import com.woka.networking.ApiResult import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper.handleApiCall import com.woka.networking.RetrofitHelper.handleApiCall
import com.woka.onboard.models.AvatarList import com.woka.onboard.models.AvatarList
import com.woka.onboard.models.Child
import com.woka.onboard.models.ChildListResponse import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse import com.woka.onboard.models.ForgotPasswrodOTPResponse
import com.woka.onboard.models.Guest import com.woka.onboard.models.Guest
@@ -13,6 +14,7 @@ import com.woka.onboard.models.LoginResponse
import com.woka.onboard.models.RegisterRequestData import com.woka.onboard.models.RegisterRequestData
import com.woka.onboard.models.RegisterResponse import com.woka.onboard.models.RegisterResponse
import com.woka.onboard.models.VerifyEmail import com.woka.onboard.models.VerifyEmail
import com.woka.onboard.models.appupdate.VersionHistoryResponseData
import okhttp3.FormBody import okhttp3.FormBody
class OnboardRepository(private val apiService: OnboardApiService) { class OnboardRepository(private val apiService: OnboardApiService) {
@@ -161,4 +163,21 @@ class OnboardRepository(private val apiService: OnboardApiService) {
} }
} }
suspend fun forgotUsername(userType: String, email: String): ApiResult<List<Child>>{
return handleApiCall {
apiService.forgotUsername(
FormBody.Builder()
.add("user_type", userType)
.add("email", email)
.build()
)
}
}
suspend fun versionHistory(): ApiResult<VersionHistoryResponseData> {
return handleApiCall {
apiService.versionHistory(2)
}
}
} }

View File

@@ -78,6 +78,11 @@ class OnboardViewModel: ViewModel(){
val forgotPwdOTPLiveData: LiveData<ApiResult<ForgotPasswrodOTPResponse>?> val forgotPwdOTPLiveData: LiveData<ApiResult<ForgotPasswrodOTPResponse>?>
get() = _forgotPwdOTPLiveData get() = _forgotPwdOTPLiveData
private val _forgotUsernameLiveData = MutableLiveData<ApiResult<List<Child>>?>()
fun clearForgotUsernameData() = _forgotUsernameLiveData.postValue(null)
val forgotUsernameLiveData: LiveData<ApiResult<List<Child>>?>
get() = _forgotUsernameLiveData
/* /*
VerifyOTP Fragment VerifyOTP Fragment
*/ */
@@ -236,6 +241,14 @@ class OnboardViewModel: ViewModel(){
} }
} }
fun forgotUsername(userType: String, email: String){
viewModelScope.launch {
_forgotUsernameLiveData.postValue(ApiResult.Loading())
val response = repository.forgotUsername(userType, email)
_forgotUsernameLiveData.postValue(response)
}
}
// otp count down timer // otp count down timer
private val otpCountDownTime = 10 * 60 * 1000L // 10 min private val otpCountDownTime = 10 * 60 * 1000L // 10 min

View File

@@ -17,6 +17,8 @@ class ShopViewModel: ViewModel() {
var onTitleChange: ((String) -> Unit)? = null var onTitleChange: ((String) -> Unit)? = null
var singleItemBehaviorDone = false
private val repository = ShopRepository private val repository = ShopRepository
// super category listing // super category listing

View File

@@ -5,9 +5,11 @@ import android.text.Html
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.woka.R import com.woka.R
@@ -53,6 +55,13 @@ class ProductFragment : Fragment() {
imageAdapter = ProductImagesAdapter() imageAdapter = ProductImagesAdapter()
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true){
override fun handleOnBackPressed() {
findNavController().popBackStack(R.id.shopFragment3, viewModel.singleItemBehaviorDone)
viewModel.singleItemBehaviorDone = false
}
})
return binding.root return binding.root
} }

View File

@@ -132,6 +132,8 @@ class ShopFragment3 : Fragment(), TabLayout.OnTabSelectedListener {
categoryTabs.show() categoryTabs.show()
categoryShimmer.hide() categoryShimmer.hide()
errorView.hide() errorView.hide()
binding.categoryTabs.removeAllTabs()
for (category in categoryList) { for (category in categoryList) {
binding.categoryTabs.addTab( binding.categoryTabs.addTab(
binding.categoryTabs.newTab() binding.categoryTabs.newTab()
@@ -184,6 +186,14 @@ class ShopFragment3 : Fragment(), TabLayout.OnTabSelectedListener {
} else { } else {
// new category data load // new category data load
productAdapter.submitList(productList) productAdapter.submitList(productList)
if (productList.size == 1){
productList[0].id?.let {productId ->
if (!viewModel.singleItemBehaviorDone){
findNavController().navigate(ShopFragment3Directions.actionShopFragment3ToProductFragment(productId))
viewModel.singleItemBehaviorDone = true
}
}
}
} }
} }
} }

View File

@@ -1,6 +1,6 @@
package com.woka.utils package com.woka.utils
data class PagingData( data class PagingData(
var nextPageToLoad: Int = 0, var quantityPerPage: Int = 6, var nextPageToLoad: Int = 0, var quantityPerPage: Int = 10,
var lastPage: Boolean = false var lastPage: Boolean = false
) )

View File

@@ -1,7 +1,6 @@
package com.woka.webseries package com.woka.webseries
import com.woka.home.mylist.MyListRepository import com.woka.home.mylist.MyListRepository
import com.woka.home.mylist.models.BookmarkedShowData
import com.woka.home.mylist.models.PostType import com.woka.home.mylist.models.PostType
import com.woka.modules.categorymodels.CategoriesResponse import com.woka.modules.categorymodels.CategoriesResponse
import com.woka.networking.ApiResult import com.woka.networking.ApiResult
@@ -18,7 +17,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import okhttp3.FormBody import okhttp3.FormBody
import kotlin.math.max
object WebSeriesRepository { object WebSeriesRepository {
// api services // api services

View File

@@ -12,6 +12,8 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.widget.AdapterView import android.widget.AdapterView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -60,6 +62,8 @@ class WebSeriesFragment : Fragment() {
private lateinit var noSignInDialog: NoSignInDialog private lateinit var noSignInDialog: NoSignInDialog
private lateinit var playerLauncher: ActivityResultLauncher<Intent>
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@@ -89,6 +93,8 @@ class WebSeriesFragment : Fragment() {
} }
continueWatchAdapter = ContinueEpisodeAdapter(requireContext()) continueWatchAdapter = ContinueEpisodeAdapter(requireContext())
initLaunchers()
initViews() initViews()
initEpisodeDialog() initEpisodeDialog()
@@ -102,6 +108,15 @@ class WebSeriesFragment : Fragment() {
} }
} }
private fun initLaunchers() {
playerLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (userPrefs?.userType != UserType.GUEST){
viewModel.loadContinueWatching()
}
}
}
private fun clickEvents() { private fun clickEvents() {
binding.apply { binding.apply {
toolbar.backBtn.setOnClickListener { toolbar.backBtn.setOnClickListener {
@@ -479,11 +494,13 @@ class WebSeriesFragment : Fragment() {
} }
} }
startActivity(Intent(activity, PlayerActivity::class.java) playerLauncher.launch(
.apply { Intent(activity, PlayerActivity::class.java)
putExtra(EXTRA_PLAY_LIST, videoPlayList) .apply {
putExtra(EXTRA_PLAY_INDEX, 0) putExtra(EXTRA_PLAY_LIST, videoPlayList)
}) putExtra(EXTRA_PLAY_INDEX, 0)
}
)
} }
} }

View File

@@ -1,7 +1,6 @@
package com.woka.wokagames package com.woka.wokagames
import com.woka.home.mylist.MyListRepository import com.woka.home.mylist.MyListRepository
import com.woka.home.mylist.models.FavGameData
import com.woka.home.mylist.models.PostType import com.woka.home.mylist.models.PostType
import com.woka.networking.ApiResult import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper import com.woka.networking.RetrofitHelper
@@ -13,7 +12,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import okhttp3.FormBody import okhttp3.FormBody
import kotlin.math.max
object GamesRepository { object GamesRepository {
// api services // api services

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp"/>
<solid android:color="@color/white"/>
</shape>

View File

@@ -77,7 +77,7 @@
android:layout_width="@dimen/_20sdp" android:layout_width="@dimen/_20sdp"
android:layout_height="@dimen/_20sdp" android:layout_height="@dimen/_20sdp"
android:contentDescription="@string/image" android:contentDescription="@string/image"
android:src="@drawable/ic_like_filled" android:src="@drawable/img_volume_down"
app:tint="@color/white" app:tint="@color/white"
app:layout_constraintTop_toTopOf="@id/volume_view" app:layout_constraintTop_toTopOf="@id/volume_view"
@@ -91,7 +91,7 @@
android:layout_width="@dimen/_20sdp" android:layout_width="@dimen/_20sdp"
android:layout_height="@dimen/_20sdp" android:layout_height="@dimen/_20sdp"
android:contentDescription="@string/image" android:contentDescription="@string/image"
android:src="@drawable/ic_like_filled" android:src="@drawable/img_volume_up"
app:tint="@color/white" app:tint="@color/white"
app:layout_constraintTop_toTopOf="@id/volume_view" app:layout_constraintTop_toTopOf="@id/volume_view"

View File

@@ -190,7 +190,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/play" android:text="@string/games"
android:fontFamily="@font/exo_2_bold" android:fontFamily="@font/exo_2_bold"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/_12ssp" android:textSize="@dimen/_12ssp"

View File

@@ -34,6 +34,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_margin="10dp" android:layout_margin="10dp"
android:src="@drawable/profile_placeholder"
/> />

View File

@@ -107,6 +107,60 @@
/> />
<LinearLayout
android:id="@+id/user_type_selection_view"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
app:layout_constraintTop_toBottomOf="@id/email"
android:layout_marginTop="25dp"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/select_user_type"
android:fontFamily="@font/exo_2_bold"
android:textSize="@dimen/_12ssp"
android:textColor="@color/color_primary"
android:textAlignment="center"
android:layout_marginHorizontal="15dp"
/>
<androidx.cardview.widget.CardView
android:id="@+id/spinner_card"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="@dimen/_40sdp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:cardCornerRadius="25dp"
>
<Spinner
android:id="@+id/user_type_spinner"
android:layout_width="match_parent"
android:layout_height="@dimen/_40sdp"
android:popupBackground="@drawable/round_bg_25_white"
android:textAlignment="textStart"
android:layout_marginHorizontal="10dp"
/>
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView <TextView
android:id="@+id/verification_txt" android:id="@+id/verification_txt"
android:visibility="gone" android:visibility="gone"

View File

@@ -9,8 +9,8 @@
<com.woka.utils.PressableImageView <com.woka.utils.PressableImageView
android:id="@+id/fm_button" android:id="@+id/fm_button"
android:layout_width="@dimen/_60sdp" android:layout_width="@dimen/_65sdp"
android:layout_height="@dimen/_60sdp" android:layout_height="@dimen/_65sdp"
android:layout_margin="10dp" android:layout_margin="10dp"
android:contentDescription="@string/image" android:contentDescription="@string/image"
@@ -148,71 +148,93 @@
/> />
<RelativeLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/tv_view" android:id="@+id/tv_view"
android:layout_width="@dimen/_200sdp" android:layout_width="wrap_content"
android:layout_height="@dimen/_140sdp" android:layout_height="wrap_content"
android:translationZ="3dp" android:translationZ="3dp"
android:layout_marginStart="25dp" android:layout_marginStart="25dp"
android:orientation="vertical"
android:gravity="center_horizontal"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.25"> app:layout_constraintVertical_bias="0.25">
<ImageView <ImageView
android:id="@+id/balloon" android:id="@+id/balloon"
android:layout_width="@dimen/_50sdp" android:layout_width="@dimen/_70sdp"
android:layout_height="@dimen/_36sdp" android:layout_height="@dimen/_45sdp"
android:layout_centerHorizontal="true"
android:contentDescription="@string/live_tv" android:contentDescription="@string/live_tv"
android:scaleType="fitXY" android:scaleType="fitXY"
android:src="@drawable/img_live_tv_balloon" /> android:src="@drawable/img_live_tv_balloon"
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:contentDescription="@string/live_tv"
android:layout_marginTop="@dimen/_15sdp"
android:src="@drawable/img_tv_border"
android:translationZ="1dp" />
<ImageView
android:id="@+id/black_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/image"
android:layout_marginHorizontal="@dimen/_37sdp"
android:layout_marginTop="@dimen/_47sdp"
android:layout_marginBottom="@dimen/_12sdp"
android:src="@android:color/black"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.52"
/> />
<androidx.media3.ui.PlayerView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/player_view" android:layout_width="@dimen/_190sdp"
android:layout_width="match_parent" android:layout_height="@dimen/_130sdp"
android:layout_height="match_parent"
android:layout_marginHorizontal="@dimen/_39sdp" android:layout_marginTop="@dimen/_22sdp"
android:layout_marginTop="@dimen/_48sdp"
android:layout_marginBottom="@dimen/_11sdp"
app:resize_mode="fill" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
>
android:background="@color/black" <ImageView
android:visibility="visible" /> android:id="@+id/tv_outline"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:contentDescription="@string/live_tv"
android:src="@drawable/img_tv_border"
android:translationZ="1dp" />
</RelativeLayout> <ImageView
android:id="@+id/black_image"
android:layout_width="@dimen/_125sdp"
android:layout_height="@dimen/_84sdp"
android:contentDescription="@string/image"
android:src="@android:color/black"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.75"
/>
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="@dimen/_125sdp"
android:layout_height="@dimen/_84sdp"
app:resize_mode="fill"
android:background="@color/black"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.75"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/g1" android:id="@+id/g1"
@@ -512,7 +534,7 @@
android:layout_width="@dimen/_75sdp" android:layout_width="@dimen/_75sdp"
android:layout_height="@dimen/_62sdp" android:layout_height="@dimen/_62sdp"
android:translationZ="3dp" android:translationZ="3dp"
android:contentDescription="@string/play" android:contentDescription="@string/games"
android:scaleType="fitXY" android:scaleType="fitXY"
android:src="@drawable/img_play_t1" /> android:src="@drawable/img_play_t1" />
@@ -522,7 +544,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="@font/exo_2_bold" android:fontFamily="@font/exo_2_bold"
android:text="@string/play" android:text="@string/games"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/_10ssp" /> android:textSize="@dimen/_10ssp" />

View File

@@ -0,0 +1,137 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/splash_bg"
tools:context=".onboard.fragments.NewUpdateFragment">
<ImageView
android:id="@+id/logo"
android:layout_width="140dp"
android:layout_height="60dp"
android:layout_marginHorizontal="15dp"
android:contentDescription="@string/app_name"
android:src="@drawable/woka_logo_full"
android:transitionName="logo"
android:layout_marginTop="15dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginVertical="25dp"
android:contentDescription="@string/image"
android:src="@drawable/img_update"
app:layout_constraintBottom_toTopOf="@+id/title"
app:layout_constraintTop_toBottomOf="@id/logo" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="15dp"
android:layout_marginBottom="15dp"
android:ellipsize="end"
android:fontFamily="@font/exo_2_bold"
android:maxLines="2"
android:textSize="@dimen/_16ssp"
android:textColor="@color/color_primary"
android:text="@string/new_update_available"
app:layout_constraintBottom_toTopOf="@id/message"
/>
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginBottom="35dp"
android:fontFamily="@font/exo_2_medium"
android:textSize="@dimen/_14ssp"
android:textAlignment="center"
android:textColor="@color/color_primary"
android:text="@string/unlock_enhanced_features_and_improved_performance_with_our_latest_app_update"
android:layout_gravity="center_horizontal"
app:layout_constraintBottom_toTopOf="@id/btn_view"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/btn_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="10dp"
android:layout_marginBottom="25dp"
android:layout_marginTop="25dp"
app:layout_constraintBottom_toBottomOf="parent"
>
<Button
android:id="@+id/skip"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="visible"
android:text="@string/skip"
android:textColor="@color/white"
android:fontFamily="@font/exo_2_bold"
android:background="@drawable/grad_btn_bg_4"
android:layout_marginHorizontal="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/update"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="visible"
android:text="@string/update_app"
android:textColor="@color/white"
android:fontFamily="@font/exo_2_bold"
android:background="@drawable/grad_btn_bg_4"
android:layout_marginHorizontal="5dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/skip"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -165,20 +165,48 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<TextView <LinearLayout
android:id="@+id/forgot_password" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2"
android:fontFamily="@font/exo_2" android:layout_marginTop="5dp"
android:padding="5dp" android:layout_marginHorizontal="15dp">
android:text="@string/forgot_password"
android:textAlignment="center"
android:textColor="@color/color_primary"
android:textSize="@dimen/_14sdp" <TextView
android:id="@+id/forgot_user_name"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
/> android:fontFamily="@font/exo_2"
android:padding="5dp"
android:text="@string/forgot_user_name"
android:textAlignment="viewStart"
android:textColor="@color/color_primary"
android:textSize="@dimen/_12ssp"
/>
<TextView
android:id="@+id/forgot_password"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:fontFamily="@font/exo_2"
android:padding="5dp"
android:text="@string/forgot_password"
android:textAlignment="viewEnd"
android:textColor="@color/color_primary"
android:textSize="@dimen/_12ssp"
/>
</LinearLayout>
<Button <Button
android:id="@+id/login" android:id="@+id/login"
@@ -186,7 +214,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp" android:layout_marginHorizontal="15dp"
android:layout_marginTop="30dp" android:layout_marginTop="25dp"
android:layout_marginBottom="15dp" android:layout_marginBottom="15dp"
android:background="@drawable/gradient_btn_bg_2" android:background="@drawable/gradient_btn_bg_2"

View File

@@ -37,6 +37,9 @@
<action <action
android:id="@+id/action_getEmailFragment_to_getCodeFragment" android:id="@+id/action_getEmailFragment_to_getCodeFragment"
app:destination="@id/getCodeFragment" /> app:destination="@id/getCodeFragment" />
<action
android:id="@+id/action_getEmailFragment_to_childListFragment"
app:destination="@id/childListFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/getCodeFragment" android:id="@+id/getCodeFragment"

View File

@@ -15,10 +15,25 @@
app:popUpTo="@id/splashFragment" app:popUpTo="@id/splashFragment"
app:popUpToInclusive="true" app:popUpToInclusive="true"
app:destination="@id/languageFragment" /> app:destination="@id/languageFragment" />
<action
android:id="@+id/action_splashFragment_to_newUpdateFragment"
app:destination="@id/newUpdateFragment"
app:popUpTo="@id/splashFragment"
app:popUpToInclusive="true"
/>
</fragment> </fragment>
<fragment <fragment
android:id="@+id/languageFragment" android:id="@+id/languageFragment"
android:name="com.woka.onboard.fragments.LanguageFragment" android:name="com.woka.onboard.fragments.LanguageFragment"
android:label="fragment_language" android:label="fragment_language"
tools:layout="@layout/fragment_language" /> tools:layout="@layout/fragment_language" />
<fragment
android:id="@+id/newUpdateFragment"
android:name="com.woka.onboard.fragments.NewUpdateFragment"
android:label="fragment_new_update"
tools:layout="@layout/fragment_new_update" >
<argument
android:name="forceNewVersion"
app:argType="integer" />
</fragment>
</navigation> </navigation>

View File

@@ -56,6 +56,7 @@
<string name="enter_your_username">अपना उपयोगकर्ता नाम दर्ज करें</string> <string name="enter_your_username">अपना उपयोगकर्ता नाम दर्ज करें</string>
<string name="password">पासवर्ड</string> <string name="password">पासवर्ड</string>
<string name="forgot_password">पासवर्ड भूल गए?</string> <string name="forgot_password">पासवर्ड भूल गए?</string>
<string name="forgot_user_name">उपयोगकर्ता नाम भूल गए?</string>
<string name="forgot_your_password">अपना पासवर्ड भूल गए?</string> <string name="forgot_your_password">अपना पासवर्ड भूल गए?</string>
<string name="please_give_us_your_username">कृपया हमें अपना उपयोगकर्ता नाम दें</string> <string name="please_give_us_your_username">कृपया हमें अपना उपयोगकर्ता नाम दें</string>
<string name="we_will_send_a_reset_code_to_your_parent_s_email">हम आपके ईमेल पर एक रीसेट कोड भेजेंगे</string> <string name="we_will_send_a_reset_code_to_your_parent_s_email">हम आपके ईमेल पर एक रीसेट कोड भेजेंगे</string>
@@ -147,4 +148,9 @@
<string name="listen_and_enjoy">सुनें और आनंद लें</string> <string name="listen_and_enjoy">सुनें और आनंद लें</string>
<string name="continue_audio_book">सुनना जारी रखें</string> <string name="continue_audio_book">सुनना जारी रखें</string>
<string name="listen_now">सुनो अब</string> <string name="listen_now">सुनो अब</string>
<string name="select_user_type">उपयोगकर्ता प्रकार चुनें</string>
<string name="please_select_a_user_type">कृपया एक उपयोगकर्ता प्रकार चुनें</string>
<string name="go_to_login">लॉगइन पर जाएं</string>
<string name="username_found">उपयोक्तानाम मिले</string>
<string name="user_name_linked_to_your_account">आपके खाते से जुड़े उपयोगकर्ता नाम</string>
</resources> </resources>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="user_type_selection" >
<item>Select a user type</item>
<item>I am above 16 years</item>
<item>I am below 16 years</item>
</string-array>
</resources>

View File

@@ -58,6 +58,7 @@
<string name="enter_your_username">Enter your username</string> <string name="enter_your_username">Enter your username</string>
<string name="password">PASSWORD</string> <string name="password">PASSWORD</string>
<string name="forgot_password">Forgot Password?</string> <string name="forgot_password">Forgot Password?</string>
<string name="forgot_user_name">Forgot Username?</string>
<string name="forgot_your_password">Forgot your Password?</string> <string name="forgot_your_password">Forgot your Password?</string>
<string name="please_give_us_your_username">PLEASE GIVE US YOUR USERNAME</string> <string name="please_give_us_your_username">PLEASE GIVE US YOUR USERNAME</string>
<string name="we_will_send_a_reset_code_to_your_parent_s_email">We will send a reset code to your email</string> <string name="we_will_send_a_reset_code_to_your_parent_s_email">We will send a reset code to your email</string>
@@ -299,4 +300,13 @@
<string name="view_all">VIEW ALL</string> <string name="view_all">VIEW ALL</string>
<string name="alert">Alert!</string> <string name="alert">Alert!</string>
<string name="are_you_sure_you_want_to_remove_item_from_cart">Are you sure you want to remove item from cart?</string> <string name="are_you_sure_you_want_to_remove_item_from_cart">Are you sure you want to remove item from cart?</string>
<string name="select_user_type">SELECT USER TYPE</string>
<string name="please_select_a_user_type">Please select a user type</string>
<string name="go_to_login">Go to login</string>
<string name="username_found">Username Found</string>
<string name="user_name_linked_to_your_account">Username linked to your account</string>
<string name="skip">SKIP</string>
<string name="update_app">UPDATE APP</string>
<string name="new_update_available">New update available</string>
<string name="unlock_enhanced_features_and_improved_performance_with_our_latest_app_update">Unlock enhanced features and improved performance with our latest app update.</string>
</resources> </resources>