diff --git a/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt b/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt index ca2911b..dcdff7c 100644 --- a/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt +++ b/app/src/main/java/com/woka/audiobooks/views/AudioBooksActivity.kt @@ -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 + 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().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().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) + } + ) } } diff --git a/app/src/main/java/com/woka/karaoke/KaraokeRepository.kt b/app/src/main/java/com/woka/karaoke/KaraokeRepository.kt index eed3d71..49e291b 100644 --- a/app/src/main/java/com/woka/karaoke/KaraokeRepository.kt +++ b/app/src/main/java/com/woka/karaoke/KaraokeRepository.kt @@ -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 { diff --git a/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt b/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt index 9e3fa77..b08a8d1 100644 --- a/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt +++ b/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt @@ -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 + 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) + ) + } + ) } } } diff --git a/app/src/main/java/com/woka/onboard/adapters/ChildAdapter.kt b/app/src/main/java/com/woka/onboard/adapters/ChildAdapter.kt index 4d83e43..28bf9fb 100644 --- a/app/src/main/java/com/woka/onboard/adapters/ChildAdapter.kt +++ b/app/src/main/java/com/woka/onboard/adapters/ChildAdapter.kt @@ -23,10 +23,12 @@ class ChildAdapter(private val childList: List) : RecyclerView.Adapter {} } } + + 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) { diff --git a/app/src/main/java/com/woka/onboard/fragments/NewUpdateFragment.kt b/app/src/main/java/com/woka/onboard/fragments/NewUpdateFragment.kt new file mode 100644 index 0000000..05477ab --- /dev/null +++ b/app/src/main/java/com/woka/onboard/fragments/NewUpdateFragment.kt @@ -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) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt index 939e224..c21798c 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt @@ -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) diff --git a/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt index 5ac34b9..53e83b5 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt @@ -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?> { - 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>() + private val versionHistoryLiveData: LiveData> + get() = _versionHistoryLiveData + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -49,7 +63,9 @@ class SplashFragment : Fragment(), Observer?> { 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?> { 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?> { 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?> { 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?> { override fun onChanged(value: ApiResult?) { // 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() diff --git a/app/src/main/java/com/woka/onboard/models/Child.kt b/app/src/main/java/com/woka/onboard/models/Child.kt index 917e072..f8173a7 100644 --- a/app/src/main/java/com/woka/onboard/models/Child.kt +++ b/app/src/main/java/com/woka/onboard/models/Child.kt @@ -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? ) \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/models/appupdate/VersionData.kt b/app/src/main/java/com/woka/onboard/models/appupdate/VersionData.kt new file mode 100644 index 0000000..069ab57 --- /dev/null +++ b/app/src/main/java/com/woka/onboard/models/appupdate/VersionData.kt @@ -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? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/models/appupdate/VersionHistoryResponseData.kt b/app/src/main/java/com/woka/onboard/models/appupdate/VersionHistoryResponseData.kt new file mode 100644 index 0000000..2eec5ba --- /dev/null +++ b/app/src/main/java/com/woka/onboard/models/appupdate/VersionHistoryResponseData.kt @@ -0,0 +1,7 @@ +package com.woka.onboard.models.appupdate + +data class VersionHistoryResponseData( + val `0`: VersionData?, + val msg: String?, + val url: String? +) \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/mvvm/OnboardApiService.kt b/app/src/main/java/com/woka/onboard/mvvm/OnboardApiService.kt index ddcff8d..1f9b256 100644 --- a/app/src/main/java/com/woka/onboard/mvvm/OnboardApiService.kt +++ b/app/src/main/java/com/woka/onboard/mvvm/OnboardApiService.kt @@ -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> + @POST("forgot_username") + suspend fun forgotUsername(@Body body: FormBody): Response>> + + @GET("version_history") + suspend fun versionHistory(@Query("device") deviceId: Int): Response> + + } \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt b/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt index 1935568..cb5bd75 100644 --- a/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt +++ b/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt @@ -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>{ + return handleApiCall { + apiService.forgotUsername( + FormBody.Builder() + .add("user_type", userType) + .add("email", email) + .build() + ) + } + } + + suspend fun versionHistory(): ApiResult { + return handleApiCall { + apiService.versionHistory(2) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt b/app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt index 5daa926..7ffc9fd 100644 --- a/app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt +++ b/app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt @@ -78,6 +78,11 @@ class OnboardViewModel: ViewModel(){ val forgotPwdOTPLiveData: LiveData?> get() = _forgotPwdOTPLiveData + private val _forgotUsernameLiveData = MutableLiveData>?>() + fun clearForgotUsernameData() = _forgotUsernameLiveData.postValue(null) + val forgotUsernameLiveData: LiveData>?> + 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 diff --git a/app/src/main/java/com/woka/shop/viewmodels/ShopViewModel.kt b/app/src/main/java/com/woka/shop/viewmodels/ShopViewModel.kt index 01ec402..124bbbd 100644 --- a/app/src/main/java/com/woka/shop/viewmodels/ShopViewModel.kt +++ b/app/src/main/java/com/woka/shop/viewmodels/ShopViewModel.kt @@ -17,6 +17,8 @@ class ShopViewModel: ViewModel() { var onTitleChange: ((String) -> Unit)? = null + var singleItemBehaviorDone = false + private val repository = ShopRepository // super category listing diff --git a/app/src/main/java/com/woka/shop/views/fragments/shop/ProductFragment.kt b/app/src/main/java/com/woka/shop/views/fragments/shop/ProductFragment.kt index 63545b5..df057eb 100644 --- a/app/src/main/java/com/woka/shop/views/fragments/shop/ProductFragment.kt +++ b/app/src/main/java/com/woka/shop/views/fragments/shop/ProductFragment.kt @@ -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 } diff --git a/app/src/main/java/com/woka/shop/views/fragments/shop/ShopFragment3.kt b/app/src/main/java/com/woka/shop/views/fragments/shop/ShopFragment3.kt index 5088eaa..30fd430 100644 --- a/app/src/main/java/com/woka/shop/views/fragments/shop/ShopFragment3.kt +++ b/app/src/main/java/com/woka/shop/views/fragments/shop/ShopFragment3.kt @@ -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 + } + } + } } } } diff --git a/app/src/main/java/com/woka/utils/PagingData.kt b/app/src/main/java/com/woka/utils/PagingData.kt index 290f091..b22d8aa 100644 --- a/app/src/main/java/com/woka/utils/PagingData.kt +++ b/app/src/main/java/com/woka/utils/PagingData.kt @@ -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 ) \ No newline at end of file diff --git a/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt b/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt index 8b612c6..9579000 100644 --- a/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt +++ b/app/src/main/java/com/woka/webseries/WebSeriesRepository.kt @@ -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 diff --git a/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt b/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt index 64acd73..167f615 100644 --- a/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt +++ b/app/src/main/java/com/woka/webseries/views/fragments/WebSeriesFragment.kt @@ -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 + 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) + } + ) } } diff --git a/app/src/main/java/com/woka/wokagames/GamesRepository.kt b/app/src/main/java/com/woka/wokagames/GamesRepository.kt index 8785fb9..a8da06c 100644 --- a/app/src/main/java/com/woka/wokagames/GamesRepository.kt +++ b/app/src/main/java/com/woka/wokagames/GamesRepository.kt @@ -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 diff --git a/app/src/main/res/drawable-hdpi/img_update.png b/app/src/main/res/drawable-hdpi/img_update.png new file mode 100644 index 0000000..96b8a45 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_update.png differ diff --git a/app/src/main/res/drawable-hdpi/img_volume_down.png b/app/src/main/res/drawable-hdpi/img_volume_down.png new file mode 100644 index 0000000..aad3cfe Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_volume_down.png differ diff --git a/app/src/main/res/drawable-hdpi/img_volume_up.png b/app/src/main/res/drawable-hdpi/img_volume_up.png new file mode 100644 index 0000000..31f2b8f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_volume_up.png differ diff --git a/app/src/main/res/drawable-hdpi/img_woka_w.png b/app/src/main/res/drawable-hdpi/img_woka_w.png index cb62c2b..3496b7b 100644 Binary files a/app/src/main/res/drawable-hdpi/img_woka_w.png and b/app/src/main/res/drawable-hdpi/img_woka_w.png differ diff --git a/app/src/main/res/drawable-ldpi/img_update.png b/app/src/main/res/drawable-ldpi/img_update.png new file mode 100644 index 0000000..8c92df9 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/img_update.png differ diff --git a/app/src/main/res/drawable-ldpi/img_volume_down.png b/app/src/main/res/drawable-ldpi/img_volume_down.png new file mode 100644 index 0000000..a1d6007 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/img_volume_down.png differ diff --git a/app/src/main/res/drawable-ldpi/img_volume_up.png b/app/src/main/res/drawable-ldpi/img_volume_up.png new file mode 100644 index 0000000..420e0b5 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/img_volume_up.png differ diff --git a/app/src/main/res/drawable-ldpi/img_woka_w.png b/app/src/main/res/drawable-ldpi/img_woka_w.png index 7c44e2d..ae7d7d8 100644 Binary files a/app/src/main/res/drawable-ldpi/img_woka_w.png and b/app/src/main/res/drawable-ldpi/img_woka_w.png differ diff --git a/app/src/main/res/drawable-mdpi/img_update.png b/app/src/main/res/drawable-mdpi/img_update.png new file mode 100644 index 0000000..a7ed1da Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_update.png differ diff --git a/app/src/main/res/drawable-mdpi/img_volume_down.png b/app/src/main/res/drawable-mdpi/img_volume_down.png new file mode 100644 index 0000000..80c5193 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_volume_down.png differ diff --git a/app/src/main/res/drawable-mdpi/img_volume_up.png b/app/src/main/res/drawable-mdpi/img_volume_up.png new file mode 100644 index 0000000..768a6c2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_volume_up.png differ diff --git a/app/src/main/res/drawable-mdpi/img_woka_w.png b/app/src/main/res/drawable-mdpi/img_woka_w.png index 02267a0..eb22198 100644 Binary files a/app/src/main/res/drawable-mdpi/img_woka_w.png and b/app/src/main/res/drawable-mdpi/img_woka_w.png differ diff --git a/app/src/main/res/drawable-xhdpi/img_update.png b/app/src/main/res/drawable-xhdpi/img_update.png new file mode 100644 index 0000000..525028e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_update.png differ diff --git a/app/src/main/res/drawable-xhdpi/img_volume_down.png b/app/src/main/res/drawable-xhdpi/img_volume_down.png new file mode 100644 index 0000000..fe437d7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_volume_down.png differ diff --git a/app/src/main/res/drawable-xhdpi/img_volume_up.png b/app/src/main/res/drawable-xhdpi/img_volume_up.png new file mode 100644 index 0000000..fbb97c2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_volume_up.png differ diff --git a/app/src/main/res/drawable-xhdpi/img_woka_w.png b/app/src/main/res/drawable-xhdpi/img_woka_w.png index fe0b1c8..2a9e864 100644 Binary files a/app/src/main/res/drawable-xhdpi/img_woka_w.png and b/app/src/main/res/drawable-xhdpi/img_woka_w.png differ diff --git a/app/src/main/res/drawable-xxhdpi/img_update.png b/app/src/main/res/drawable-xxhdpi/img_update.png new file mode 100644 index 0000000..9c3cc45 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_update.png differ diff --git a/app/src/main/res/drawable-xxhdpi/img_volume_down.png b/app/src/main/res/drawable-xxhdpi/img_volume_down.png new file mode 100644 index 0000000..a9ecf19 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_volume_down.png differ diff --git a/app/src/main/res/drawable-xxhdpi/img_volume_up.png b/app/src/main/res/drawable-xxhdpi/img_volume_up.png new file mode 100644 index 0000000..c84a3e1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_volume_up.png differ diff --git a/app/src/main/res/drawable-xxhdpi/img_woka_w.png b/app/src/main/res/drawable-xxhdpi/img_woka_w.png index e45c717..65617d2 100644 Binary files a/app/src/main/res/drawable-xxhdpi/img_woka_w.png and b/app/src/main/res/drawable-xxhdpi/img_woka_w.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_update.png b/app/src/main/res/drawable-xxxhdpi/img_update.png new file mode 100644 index 0000000..8beb8a6 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_update.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_volume_down.png b/app/src/main/res/drawable-xxxhdpi/img_volume_down.png new file mode 100644 index 0000000..5b53954 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_volume_down.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_volume_up.png b/app/src/main/res/drawable-xxxhdpi/img_volume_up.png new file mode 100644 index 0000000..3cafc8a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_volume_up.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_woka_w.png b/app/src/main/res/drawable-xxxhdpi/img_woka_w.png index 60f8635..4c5028b 100644 Binary files a/app/src/main/res/drawable-xxxhdpi/img_woka_w.png and b/app/src/main/res/drawable-xxxhdpi/img_woka_w.png differ diff --git a/app/src/main/res/drawable/round_bg_25_white.xml b/app/src/main/res/drawable/round_bg_25_white.xml new file mode 100644 index 0000000..ace3b3a --- /dev/null +++ b/app/src/main/res/drawable/round_bg_25_white.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fmactivity.xml b/app/src/main/res/layout/activity_fmactivity.xml index eaece9d..bbe3a3a 100644 --- a/app/src/main/res/layout/activity_fmactivity.xml +++ b/app/src/main/res/layout/activity_fmactivity.xml @@ -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" diff --git a/app/src/main/res/layout/activity_games.xml b/app/src/main/res/layout/activity_games.xml index 0f37dfa..efc81b1 100644 --- a/app/src/main/res/layout/activity_games.xml +++ b/app/src/main/res/layout/activity_games.xml @@ -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" diff --git a/app/src/main/res/layout/child_view_holder.xml b/app/src/main/res/layout/child_view_holder.xml index 2f3636d..49d3915 100644 --- a/app/src/main/res/layout/child_view_holder.xml +++ b/app/src/main/res/layout/child_view_holder.xml @@ -34,6 +34,7 @@ android:layout_height="match_parent" android:layout_margin="10dp" + android:src="@drawable/profile_placeholder" /> diff --git a/app/src/main/res/layout/fragment_get_email.xml b/app/src/main/res/layout/fragment_get_email.xml index 1f54459..db34362 100644 --- a/app/src/main/res/layout/fragment_get_email.xml +++ b/app/src/main/res/layout/fragment_get_email.xml @@ -107,6 +107,60 @@ /> + + + + + + + + + + + + - - - - - - - android:background="@color/black" - android:visibility="visible" /> + - + + + + + + + @@ -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" /> diff --git a/app/src/main/res/layout/fragment_new_update.xml b/app/src/main/res/layout/fragment_new_update.xml new file mode 100644 index 0000000..0a62681 --- /dev/null +++ b/app/src/main/res/layout/fragment_new_update.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + +