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.view.WindowManager
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
@@ -58,6 +60,8 @@ class AudioBooksActivity : WokaBaseActivity() {
private lateinit var noSignInDialog: NoSignInDialog
private lateinit var playerLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
@@ -87,6 +91,8 @@ class AudioBooksActivity : WokaBaseActivity() {
noSignInDialog = NoSignInDialog(this)
initLaunchers()
initViews()
initAudioDialog()
@@ -107,6 +113,15 @@ class AudioBooksActivity : WokaBaseActivity() {
ClicksHelper.upsertClickEvent(ContentType.OTHERS)
}
private fun initLaunchers() {
playerLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (userPrefs?.userType != UserType.GUEST){
viewModel.loadContinueData()
}
}
}
private fun initViews() {
binding.apply {
adjustTrailerImage()
@@ -364,27 +379,29 @@ class AudioBooksActivity : WokaBaseActivity() {
}
url?.let {
startActivity(Intent(this, PlayerActivity::class.java).apply {
putExtra(
PlayerActivity.EXTRA_PLAY_LIST,
VideoPlayList(
ArrayList<PlaylistItem>().apply {
add(
PlaylistItem.Builder()
.file(it)
.image(it)
.title(title)
.build()
)
},
mutableListOf(VideoViewData(
audioBookData.id,
ContentType.AUDIO
))
playerLauncher.launch(
Intent(this, PlayerActivity::class.java).apply {
putExtra(
PlayerActivity.EXTRA_PLAY_LIST,
VideoPlayList(
ArrayList<PlaylistItem>().apply {
add(
PlaylistItem.Builder()
.file(it)
.image(it)
.title(title)
.build()
)
},
mutableListOf(VideoViewData(
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
import com.woka.home.mylist.MyListRepository
import com.woka.home.mylist.models.FavKaraokeData
import com.woka.home.mylist.models.PostType
import com.woka.karaoke.models.continuesing.ContinueKaraokeResponse
import com.woka.karaoke.models.listing.KaraokeData
@@ -14,7 +13,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.FormBody
import kotlin.math.max
object KaraokeRepository {

View File

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

View File

@@ -1,10 +1,11 @@
package com.woka.onboard.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import com.woka.R
@@ -13,6 +14,7 @@ import com.woka.database.models.ContentType
import com.woka.databinding.FragmentChildListBinding
import com.woka.onboard.adapters.ChildAdapter
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.mvvm.OnboardViewModel
@@ -24,11 +26,14 @@ class ChildListFragment : Fragment() {
private var isUnder16: Boolean = false
private var email: String = ""
private var isForgotUsername = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
isUnder16 = it.getBoolean(IS_UNDER_16)
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]
}
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true){
override fun handleOnBackPressed() {
viewModel.clearForgotUsernameData()
findNavController().popBackStack()
}
})
initViews()
clickEvents()
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() {
binding.apply {
next.setOnClickListener {
gotoSignUpFragment()
if (isForgotUsername){
viewModel.clearForgotUsernameData()
findNavController().popBackStack(R.id.signInFragment, false)
}else{
gotoSignUpFragment()
}
ClicksHelper.upsertClickEvent(ContentType.OTHERS)
}
backBtn.setOnClickListener {
activity?.onBackPressedDispatcher?.onBackPressed()
}
}
}
@@ -64,7 +99,9 @@ class ChildListFragment : Fragment() {
}
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.VISIBLE
import android.view.ViewGroup
import android.widget.ArrayAdapter
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
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.PARENT_TYPE
import com.woka.utils.ProgressView
import com.woka.utils.show
import com.woka.utils.toast
/*
@@ -34,6 +36,7 @@ class GetEmailFragment : Fragment() {
companion object {
const val IS_UNDER_16 = "is_under_16"
const val IS_RESET_PASSWORD_INTENT = "reset_password_intent"
const val IS_FORGOT_USER_NAME = "forgot_user_name"
}
private lateinit var binding: FragmentGetEmailBinding
@@ -43,12 +46,14 @@ class GetEmailFragment : Fragment() {
private var isUnder16: Boolean = false
private var isResetPasswordIntent: Boolean = false
private var isForgotUserName: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
isUnder16 = it.getBoolean(IS_UNDER_16, 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 -> {}
}
}
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() {
@@ -165,7 +197,20 @@ class GetEmailFragment : Fragment() {
private fun initViews() {
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
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
viewModel.forgotPwdSendOTP(binding.email.text.toString())
} 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.home.views.HomeActivity
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.mvvm.OnboardViewModel
import com.woka.userPreference.UserType
@@ -200,6 +201,15 @@ class SignInFragment : Fragment() {
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 {
activity?.onBackPressedDispatcher?.onBackPressed()
ClicksHelper.upsertClickEvent(ContentType.OTHERS)

View File

@@ -8,17 +8,25 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import com.woka.BuildConfig
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.FragmentSplashBinding
import com.woka.home.views.HomeActivity
import com.woka.userdata.userDataModels.UserDataResponse
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.userdata.userDataModels.UserDataResponse
import com.woka.utils.hide
import com.woka.utils.show
import com.woka.utils.toast
@@ -30,10 +38,16 @@ import kotlinx.coroutines.launch
*/
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 val _versionHistoryLiveData = MutableLiveData<ApiResult<VersionHistoryResponseData>>()
private val versionHistoryLiveData: LiveData<ApiResult<VersionHistoryResponseData>>
get() = _versionHistoryLiveData
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
@@ -49,7 +63,9 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
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
// thus, loading data
userPrefs?.loadUserData()
@@ -63,7 +79,18 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
retryBtn.setOnClickListener {
retryBtn.hide()
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() {
binding.logo.animate().scaleXBy(1f).scaleYBy(1f)
.setDuration(2000)
.setListener(object : Animator.AnimatorListener{
.setListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch {
delay(2000)
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)
}
listenVersionHistory()
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
@@ -105,18 +126,70 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
player = null
}
private fun goForward(){
if (userPrefs?.userType == UserType.NONE){
private fun loadVersionHistory() {
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
// going through normal onboard process
try {
val extras = FragmentNavigatorExtras(binding.logo to "logo")
findNavController().navigate(R.id.action_splashFragment_to_languageFragment,
null, null, extras)
findNavController().navigate(
R.id.action_splashFragment_to_languageFragment,
null, null, extras
)
} catch (e: Exception) {
// do nothing
}
}else{
} else {
// going to home activity as any of the user is logged in
activity?.let {
startActivity(Intent(it, HomeActivity::class.java).apply {
@@ -129,12 +202,13 @@ class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>?> {
override fun onChanged(value: ApiResult<UserDataResponse>?) {
// on user data loaded
when (value){
when (value) {
is ApiResult.Error -> {
toast(value.errorMessage)
binding.retryBtn.show()
binding.progressBar.hide()
}
is ApiResult.Loading -> {}
is ApiResult.Success -> {
binding.retryBtn.hide()

View File

@@ -1,8 +1,8 @@
package com.woka.onboard.models
data class Child(
val avtar: String,
val fullname: String,
val id: Int,
val username: String
val avtar: String?,
val fullname: String?,
val id: Int?,
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.onboard.models.AvatarList
import com.woka.onboard.models.Child
import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse
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.RegisterResponse
import com.woka.onboard.models.VerifyEmail
import com.woka.onboard.models.appupdate.VersionHistoryResponseData
import okhttp3.FormBody
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
interface OnboardApiService {
@@ -60,4 +63,11 @@ interface OnboardApiService {
@POST("guest_login")
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.RetrofitHelper.handleApiCall
import com.woka.onboard.models.AvatarList
import com.woka.onboard.models.Child
import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse
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.RegisterResponse
import com.woka.onboard.models.VerifyEmail
import com.woka.onboard.models.appupdate.VersionHistoryResponseData
import okhttp3.FormBody
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>?>
get() = _forgotPwdOTPLiveData
private val _forgotUsernameLiveData = MutableLiveData<ApiResult<List<Child>>?>()
fun clearForgotUsernameData() = _forgotUsernameLiveData.postValue(null)
val forgotUsernameLiveData: LiveData<ApiResult<List<Child>>?>
get() = _forgotUsernameLiveData
/*
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
private val otpCountDownTime = 10 * 60 * 1000L // 10 min

View File

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

View File

@@ -5,9 +5,11 @@ import android.text.Html
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.google.android.material.tabs.TabLayoutMediator
import com.woka.R
@@ -53,6 +55,13 @@ class ProductFragment : Fragment() {
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
}

View File

@@ -132,6 +132,8 @@ class ShopFragment3 : Fragment(), TabLayout.OnTabSelectedListener {
categoryTabs.show()
categoryShimmer.hide()
errorView.hide()
binding.categoryTabs.removeAllTabs()
for (category in categoryList) {
binding.categoryTabs.addTab(
binding.categoryTabs.newTab()
@@ -184,6 +186,14 @@ class ShopFragment3 : Fragment(), TabLayout.OnTabSelectedListener {
} else {
// new category data load
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
data class PagingData(
var nextPageToLoad: Int = 0, var quantityPerPage: Int = 6,
var nextPageToLoad: Int = 0, var quantityPerPage: Int = 10,
var lastPage: Boolean = false
)

View File

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

View File

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

View File

@@ -1,7 +1,6 @@
package com.woka.wokagames
import com.woka.home.mylist.MyListRepository
import com.woka.home.mylist.models.FavGameData
import com.woka.home.mylist.models.PostType
import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper
@@ -13,7 +12,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.FormBody
import kotlin.math.max
object GamesRepository {
// 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_height="@dimen/_20sdp"
android:contentDescription="@string/image"
android:src="@drawable/ic_like_filled"
android:src="@drawable/img_volume_down"
app:tint="@color/white"
app:layout_constraintTop_toTopOf="@id/volume_view"
@@ -91,7 +91,7 @@
android:layout_width="@dimen/_20sdp"
android:layout_height="@dimen/_20sdp"
android:contentDescription="@string/image"
android:src="@drawable/ic_like_filled"
android:src="@drawable/img_volume_up"
app:tint="@color/white"
app:layout_constraintTop_toTopOf="@id/volume_view"

View File

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

View File

@@ -34,6 +34,7 @@
android:layout_height="match_parent"
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
android:id="@+id/verification_txt"
android:visibility="gone"

View File

@@ -9,8 +9,8 @@
<com.woka.utils.PressableImageView
android:id="@+id/fm_button"
android:layout_width="@dimen/_60sdp"
android:layout_height="@dimen/_60sdp"
android:layout_width="@dimen/_65sdp"
android:layout_height="@dimen/_65sdp"
android:layout_margin="10dp"
android:contentDescription="@string/image"
@@ -148,71 +148,93 @@
/>
<RelativeLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/tv_view"
android:layout_width="@dimen/_200sdp"
android:layout_height="@dimen/_140sdp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:translationZ="3dp"
android:layout_marginStart="25dp"
android:orientation="vertical"
android:gravity="center_horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.25">
<ImageView
android:id="@+id/balloon"
android:layout_width="@dimen/_50sdp"
android:layout_height="@dimen/_36sdp"
android:layout_centerHorizontal="true"
android:layout_width="@dimen/_70sdp"
android:layout_height="@dimen/_45sdp"
android:contentDescription="@string/live_tv"
android:scaleType="fitXY"
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"
android:src="@drawable/img_live_tv_balloon"
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
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="@dimen/_190sdp"
android:layout_height="@dimen/_130sdp"
android:layout_marginHorizontal="@dimen/_39sdp"
android:layout_marginTop="@dimen/_48sdp"
android:layout_marginBottom="@dimen/_11sdp"
android:layout_marginTop="@dimen/_22sdp"
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"
android:visibility="visible" />
<ImageView
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
android:id="@+id/g1"
@@ -512,7 +534,7 @@
android:layout_width="@dimen/_75sdp"
android:layout_height="@dimen/_62sdp"
android:translationZ="3dp"
android:contentDescription="@string/play"
android:contentDescription="@string/games"
android:scaleType="fitXY"
android:src="@drawable/img_play_t1" />
@@ -522,7 +544,7 @@
android:layout_height="wrap_content"
android:fontFamily="@font/exo_2_bold"
android:text="@string/play"
android:text="@string/games"
android:textAlignment="center"
android:textColor="@color/white"
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>
<TextView
android:id="@+id/forgot_password"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2"
android:fontFamily="@font/exo_2"
android:padding="5dp"
android:text="@string/forgot_password"
android:textAlignment="center"
android:textColor="@color/color_primary"
android:layout_marginTop="5dp"
android:layout_marginHorizontal="15dp">
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
android:id="@+id/login"
@@ -186,7 +214,7 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="30dp"
android:layout_marginTop="25dp"
android:layout_marginBottom="15dp"
android:background="@drawable/gradient_btn_bg_2"

View File

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

View File

@@ -15,10 +15,25 @@
app:popUpTo="@id/splashFragment"
app:popUpToInclusive="true"
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
android:id="@+id/languageFragment"
android:name="com.woka.onboard.fragments.LanguageFragment"
android:label="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>

View File

@@ -56,6 +56,7 @@
<string name="enter_your_username">अपना उपयोगकर्ता नाम दर्ज करें</string>
<string name="password">पासवर्ड</string>
<string name="forgot_password">पासवर्ड भूल गए?</string>
<string name="forgot_user_name">उपयोगकर्ता नाम भूल गए?</string>
<string name="forgot_your_password">अपना पासवर्ड भूल गए?</string>
<string name="please_give_us_your_username">कृपया हमें अपना उपयोगकर्ता नाम दें</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="continue_audio_book">सुनना जारी रखें</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>

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="password">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="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>
@@ -299,4 +300,13 @@
<string name="view_all">VIEW ALL</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="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>