From 8cf0ee1c289555ca3045bdad9f9e71d10f6900a1 Mon Sep 17 00:00:00 2001 From: AdityaGaikwad Date: Thu, 6 Jun 2024 20:50:41 +0530 Subject: [PATCH] Woka support scrolling issue resolved Completed UserProfileActivity.kt with api integration Completed whole flow of add child from guardian app with all api integration of child registration Deactivate account api integration. Flow changes in user log in --- app/src/main/AndroidManifest.xml | 6 + .../main/java/com/woka/home/HomeActivity.kt | 125 +++++-- .../main/java/com/woka/home/HomeViewModel.kt | 19 +- .../com/woka/home/fragments/Home1Fragment.kt | 5 +- .../com/woka/home/fragments/Home2Fragment.kt | 9 +- .../home/sidebar/profile/ProfileViewModel.kt | 25 ++ .../sidebar/profile/UserProfileActivity.kt | 186 ++++++++++ .../home/sidebar/support/SupportActivity.kt | 18 + .../java/com/woka/modules/ModuleApiService.kt | 2 +- .../java/com/woka/modules/ModuleRepository.kt | 2 +- .../main/java/com/woka/mvvm/UserApiService.kt | 15 - .../main/java/com/woka/mvvm/UserRepository.kt | 20 - .../java/com/woka/onboard/OnboardActivity.kt | 23 ++ .../onboard/fragments/SelectAvatarFragment.kt | 35 +- .../woka/onboard/fragments/SignInFragment.kt | 21 +- .../woka/onboard/fragments/SignUpFragment.kt | 27 +- .../woka/onboard/fragments/SplashFragment.kt | 6 +- .../com/woka/onboard/models/LoginResponse.kt | 2 +- .../woka/onboard/models/RegisterResponse.kt | 2 +- .../woka/onboard/mvvm/OnboardRepository.kt | 3 +- .../com/woka/onboard/mvvm/OnboardViewModel.kt | 4 +- .../com/woka/userPreference/UserPreference.kt | 35 +- .../java/com/woka/userdata/UserApiService.kt | 24 ++ .../java/com/woka/userdata/UserRepository.kt | 42 +++ .../userDataModels/ChildDetail.kt | 2 +- .../userDataModels/Gender.kt | 2 +- .../userDataModels/InterestTopic.kt | 2 +- .../userDataModels/Language.kt | 2 +- .../userDataModels/UserData.kt | 3 +- .../userDataModels/UserDataResponse.kt | 2 +- .../userDataModels/UserNotificationData.kt | 2 +- app/src/main/java/com/woka/utils/Gender.kt | 2 +- app/src/main/res/drawable/ic_pen.xml | 5 + app/src/main/res/layout/activity_home.xml | 111 ++++-- .../main/res/layout/activity_user_profile.xml | 351 ++++++++++++++++++ app/src/main/res/layout/fragment_sign_up.xml | 3 + .../main/res/navigation/nav_graph_onboard.xml | 3 + app/src/main/res/values/strings.xml | 12 + 38 files changed, 989 insertions(+), 169 deletions(-) create mode 100644 app/src/main/java/com/woka/home/sidebar/profile/ProfileViewModel.kt create mode 100644 app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt delete mode 100644 app/src/main/java/com/woka/mvvm/UserApiService.kt delete mode 100644 app/src/main/java/com/woka/mvvm/UserRepository.kt create mode 100644 app/src/main/java/com/woka/userdata/UserApiService.kt create mode 100644 app/src/main/java/com/woka/userdata/UserRepository.kt rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/ChildDetail.kt (77%) rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/Gender.kt (61%) rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/InterestTopic.kt (63%) rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/Language.kt (62%) rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/UserData.kt (86%) rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/UserDataResponse.kt (78%) rename app/src/main/java/com/woka/{mvvm => userdata}/userDataModels/UserNotificationData.kt (89%) create mode 100644 app/src/main/res/drawable/ic_pen.xml create mode 100644 app/src/main/res/layout/activity_user_profile.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 728b9b3..701e14b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,12 @@ android:supportsRtl="true" android:theme="@style/Theme.Woka" tools:targetApi="31"> + + { - progressView.hide() - toast(it.errorMessage) - } - is ApiResult.Loading -> { - progressView.show(getString(R.string.logging_you_out)) - } - is ApiResult.Success -> { - startActivity(Intent(this, OnboardActivity::class.java).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - }) - finish() - - userPrefs?.logout() - } - null -> {} - } - } - - minuteReceiver = object : BroadcastReceiver(){ - override fun onReceive(context: Context?, intent: Intent?) { - // this function is called every minute - if (intent?.action == Intent.ACTION_TIME_TICK){ - updateBackground() - } - } - } - - registerReceiver(minuteReceiver, IntentFilter(Intent.ACTION_TIME_TICK)) + setObservers() initViews() @@ -161,6 +131,61 @@ class HomeActivity : WokaBaseActivity(), unregisterReceiver(minuteReceiver) } + private fun setObservers(){ + userPrefs?.userLiveData?.observe(this, this) + + viewModel.logoutLiveData.observe(this){ + when(it){ + is ApiResult.Error -> { + progressView.hide() + toast(it.errorMessage) + } + is ApiResult.Loading -> { + progressView.show(getString(R.string.logging_you_out)) + } + is ApiResult.Success -> { + startActivity(Intent(this, OnboardActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + }) + finish() + + userPrefs?.logout() + } + null -> {} + } + } + + viewModel.deActivateLiveData.observe(this){ + when(it){ + is ApiResult.Error -> { + progressView.hide() + toast(it.errorMessage) + } + is ApiResult.Loading -> progressView.show() + is ApiResult.Success -> { + startActivity(Intent(this, OnboardActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + }) + finish() + + userPrefs?.logout() + } + null -> {} + } + } + + minuteReceiver = object : BroadcastReceiver(){ + override fun onReceive(context: Context?, intent: Intent?) { + // this function is called every minute + if (intent?.action == Intent.ACTION_TIME_TICK){ + updateBackground() + } + } + } + + registerReceiver(minuteReceiver, IntentFilter(Intent.ACTION_TIME_TICK)) + } + private fun initViews() { binding.apply { val versionName = "VER ${BuildConfig.VERSION_NAME}" @@ -180,7 +205,12 @@ class HomeActivity : WokaBaseActivity(), getString(R.string.login_register) }else{ - // hiding menu options + // showing menu options + val type = userPrefs?.userType + if (userPrefs?.userType == UserType.GUARDIAN){ + sbAddChild.show() + } + sbDeActivateAccount.show() sbMyOrders.show() sbMyProfile.show() @@ -276,6 +306,31 @@ class HomeActivity : WokaBaseActivity(), startActivity(Intent(this@HomeActivity, SupportActivity::class.java), ActivityOptions.makeSceneTransitionAnimation(this@HomeActivity).toBundle()) } + + sbMyProfileCard.setOnClickListener { + startActivity(Intent(this@HomeActivity, UserProfileActivity::class.java)) + } + + sbAddChildCard.setOnClickListener { + startActivity(Intent(this@HomeActivity, OnboardActivity::class.java) + .apply { + putExtra(ONBOARD_ACTIVITY_INTENT, ADD_CHILD_INTENT) + }) + } + + sbDeActivateAccountCard.setOnClickListener { + decisionDialog.apply { + title = getString(R.string.deactivate_woka_account) + message = + getString(R.string.by_clicking_on_the_button_below_your_account_will_get_deactivated_your_data_will_be_erased_after_a_month) + setPositiveButton(getString(R.string.yes)){ + viewModel.deActivateAccount() + } + setNegativeButton(getString(R.string.no)) + show() + } + } + } } diff --git a/app/src/main/java/com/woka/home/HomeViewModel.kt b/app/src/main/java/com/woka/home/HomeViewModel.kt index fa69c48..50c9e98 100644 --- a/app/src/main/java/com/woka/home/HomeViewModel.kt +++ b/app/src/main/java/com/woka/home/HomeViewModel.kt @@ -9,16 +9,12 @@ import androidx.lifecycle.viewModelScope import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.woka.home.BottomNavigation.Companion.HOME -import com.woka.mvvm.UserApiService -import com.woka.mvvm.UserRepository import com.woka.networking.ApiResult -import com.woka.networking.RetrofitHelper +import com.woka.userdata.UserRepository import kotlinx.coroutines.launch class HomeViewModel: ViewModel(){ - private val userRepository = UserRepository(RetrofitHelper.getRetrofit().create(UserApiService::class.java)) - var selectedBottomTab: Int = HOME var isHomeBackgroundBlurred: Boolean = false @@ -30,6 +26,10 @@ class HomeViewModel: ViewModel(){ val logoutLiveData: LiveData?> get() = _logoutLiveData + private val _deActivateLiveData = MutableLiveData?>() + val deActivateLiveData: LiveData?> + get() = _deActivateLiveData + var player: ExoPlayer? = null fun initPlayer(context: Context) { @@ -51,7 +51,14 @@ class HomeViewModel: ViewModel(){ fun logout(){ viewModelScope.launch { _logoutLiveData.postValue(ApiResult.Loading()) - _logoutLiveData.postValue(userRepository.logout()) + _logoutLiveData.postValue(UserRepository.logout()) + } + } + + fun deActivateAccount(){ + viewModelScope.launch { + _deActivateLiveData.postValue(ApiResult.Loading()) + _deActivateLiveData.postValue(UserRepository.deActivateAccount()) } } diff --git a/app/src/main/java/com/woka/home/fragments/Home1Fragment.kt b/app/src/main/java/com/woka/home/fragments/Home1Fragment.kt index 288ed3e..55c1bad 100644 --- a/app/src/main/java/com/woka/home/fragments/Home1Fragment.kt +++ b/app/src/main/java/com/woka/home/fragments/Home1Fragment.kt @@ -8,7 +8,6 @@ import android.content.Context import android.content.Intent import android.content.Intent.ACTION_TIME_TICK import android.content.IntentFilter -import android.net.Uri import android.os.Bundle import android.util.DisplayMetrics import android.view.LayoutInflater @@ -17,15 +16,13 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.google.android.exoplayer2.ExoPlayer -import com.google.android.exoplayer2.MediaItem import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.databinding.FragmentHome1Binding import com.woka.home.HomeViewModel import com.woka.home.MoreHomeActivity import com.woka.home.TimePeriod -import com.woka.mvvm.userDataModels.UserDataResponse +import com.woka.userdata.userDataModels.UserDataResponse import com.woka.networking.ApiResult import com.woka.players.LiveStreamPlayerActivity import com.woka.utils.UserType diff --git a/app/src/main/java/com/woka/home/fragments/Home2Fragment.kt b/app/src/main/java/com/woka/home/fragments/Home2Fragment.kt index 617fd47..0e4caed 100644 --- a/app/src/main/java/com/woka/home/fragments/Home2Fragment.kt +++ b/app/src/main/java/com/woka/home/fragments/Home2Fragment.kt @@ -1,24 +1,17 @@ package com.woka.home.fragments import android.content.Intent -import android.graphics.Bitmap -import android.graphics.Canvas -import android.media.MediaMetadataRetriever -import android.net.Uri import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater -import android.view.TextureView import android.view.View import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.google.android.exoplayer2.ExoPlayer -import com.google.android.exoplayer2.MediaItem import com.woka.R import com.woka.WokaApp import com.woka.databinding.FragmentHome2Binding import com.woka.home.HomeViewModel -import com.woka.mvvm.userDataModels.UserDataResponse +import com.woka.userdata.userDataModels.UserDataResponse import com.woka.networking.ApiResult import com.woka.players.LiveStreamPlayerActivity import com.woka.utils.UserType diff --git a/app/src/main/java/com/woka/home/sidebar/profile/ProfileViewModel.kt b/app/src/main/java/com/woka/home/sidebar/profile/ProfileViewModel.kt new file mode 100644 index 0000000..cb64efe --- /dev/null +++ b/app/src/main/java/com/woka/home/sidebar/profile/ProfileViewModel.kt @@ -0,0 +1,25 @@ +package com.woka.home.sidebar.profile + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.woka.networking.ApiResult +import com.woka.userdata.UserRepository +import kotlinx.coroutines.launch + +class ProfileViewModel: ViewModel() { + + private val _updateProfileLiveData = MutableLiveData>() + val updateProfileLiveData: LiveData> + get() = _updateProfileLiveData + + fun updateProfile(email: String, name: String, gender: String){ + viewModelScope.launch { + _updateProfileLiveData.postValue(ApiResult.Loading()) + _updateProfileLiveData.postValue(UserRepository.updateProfile( + name, email, gender + )) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt b/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt new file mode 100644 index 0000000..ae742c6 --- /dev/null +++ b/app/src/main/java/com/woka/home/sidebar/profile/UserProfileActivity.kt @@ -0,0 +1,186 @@ +package com.woka.home.sidebar.profile + +import android.graphics.Color +import android.os.Bundle +import android.transition.Slide +import android.view.Gravity.END +import androidx.activity.enableEdgeToEdge +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.woka.R +import com.woka.WokaApp.Companion.userPrefs +import com.woka.databinding.ActivityUserProfileBinding +import com.woka.userdata.userDataModels.UserData +import com.woka.networking.ApiResult +import com.woka.utils.Gender +import com.woka.utils.ProgressView +import com.woka.utils.WokaBaseActivity +import com.woka.utils.hide +import com.woka.utils.toast + +class UserProfileActivity : WokaBaseActivity() { + + private lateinit var binding: ActivityUserProfileBinding + + private lateinit var viewModel: ProfileViewModel + + private lateinit var progressView: ProgressView + + private var selectedGender = Gender.NONE + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + binding = ActivityUserProfileBinding.inflate(layoutInflater) + setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + + viewModel = ViewModelProvider(this)[ProfileViewModel::class.java] + progressView = ProgressView(this, getString(R.string.please_wait)) + + clickEvents() + + setObservers() + } + + private fun clickEvents() { + binding.apply { + genderM.setOnClickListener { selectGender(Gender.MALE) } + genderF.setOnClickListener { selectGender(Gender.FEMALE) } + + backBtn.setOnClickListener { + onBackPressedDispatcher.onBackPressed() + } + + update.setOnClickListener { + if (allOkay()){ + viewModel.updateProfile( + email = email.text.toString(), + name = fullName.text.toString(), + gender = if (selectedGender == Gender.MALE) { + "2" + }else{ + "1" + } + ) + } + } + } + } + + private fun setObservers() { + userPrefs?.userLiveData?.observe(this){ + when(it){ + is ApiResult.Error -> { + binding.main.hide() + toast(it.errorMessage) + } + is ApiResult.Loading -> {} + is ApiResult.Success -> { + it.data?.result?.let { userData -> + updateUserData(userData) + } + } + null -> {} + } + } + + viewModel.updateProfileLiveData.observe(this){ + when(it){ + is ApiResult.Error -> { + progressView.hide() + toast(it.errorMessage) + } + is ApiResult.Loading -> progressView.show() + is ApiResult.Success -> { + progressView.hide() + toast(it.message) + + val userData = userPrefs?.userData?.copy( + fullname = binding.fullName.text.toString() + ) + userPrefs?.updateUserData(userData) + } + } + } + + } + + private fun allOkay(): Boolean{ + var allOkay = true + + binding.apply { + if (fullName.text.isEmpty()){ + allOkay = false + fullName.error = getString(R.string.required) + } + + if (selectedGender == Gender.NONE){ + allOkay = false + toast(getString(R.string.select_a_gender)) + } + } + + return allOkay + } + + private fun updateUserData(userData: UserData){ + binding.apply { + val userName = ", ${userData.username}" + userUsername.text = userName + + userData.avtar?.let { + Glide.with(this@UserProfileActivity) + .load(it) + .placeholder(android.R.color.darker_gray) + .placeholder(R.drawable.profile_placeholder) + .into(profileImage) + } + + fullName.setText(userData.fullname) + + email.text = userData.email + + birthdate.text = userData.birthdate + + } + } + + private fun selectGender(gender: Gender) { + binding.apply { + when (gender) { + Gender.MALE -> { + genderM.setCardBackgroundColor(Color.WHITE) + genderM.cardElevation = 5f + + genderF.setCardBackgroundColor(resources.getColor(R.color.white_50)) + genderF.cardElevation = 0f + } + + Gender.FEMALE -> { + genderF.setCardBackgroundColor(Color.WHITE) + genderF.cardElevation = 5f + + genderM.setCardBackgroundColor(resources.getColor(R.color.white_50)) + genderM.cardElevation = 0f + } + + Gender.NONE -> { + genderM.setCardBackgroundColor(resources.getColor(R.color.white_50)) + genderM.cardElevation = 0f + + genderF.setCardBackgroundColor(resources.getColor(R.color.white_50)) + genderF.cardElevation = 0f + } + } + } + + selectedGender = gender + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt b/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt index 8092125..a563263 100644 --- a/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt +++ b/app/src/main/java/com/woka/home/sidebar/support/SupportActivity.kt @@ -1,9 +1,11 @@ package com.woka.home.sidebar.support +import android.annotation.SuppressLint import android.os.Bundle import android.transition.Slide import android.util.Patterns import android.view.Gravity +import android.view.MotionEvent import android.widget.ArrayAdapter import androidx.activity.enableEdgeToEdge import androidx.core.view.ViewCompat @@ -67,12 +69,15 @@ class SupportActivity : WokaBaseActivity() { is ApiResult.Success -> { progressView.hide() toast(it.message) + + onBackPressedDispatcher.onBackPressed() } null -> {} } } } + @SuppressLint("ClickableViewAccessibility") private fun initViews() { binding.apply { @@ -93,6 +98,19 @@ class SupportActivity : WokaBaseActivity() { ) subjectSpinner.setAdapter(adapter) + + message.setOnTouchListener { v, event -> + if (message.hasFocus()) { + v.parent.requestDisallowInterceptTouchEvent(true) + when (event.action and MotionEvent.ACTION_MASK) { + MotionEvent.ACTION_SCROLL -> { + v.parent.requestDisallowInterceptTouchEvent(false) + return@setOnTouchListener true + } + } + } + false + } } } diff --git a/app/src/main/java/com/woka/modules/ModuleApiService.kt b/app/src/main/java/com/woka/modules/ModuleApiService.kt index 070087c..09f01eb 100644 --- a/app/src/main/java/com/woka/modules/ModuleApiService.kt +++ b/app/src/main/java/com/woka/modules/ModuleApiService.kt @@ -20,6 +20,6 @@ interface ModuleApiService { @POST("guest_queries_store") suspend fun supportForGuest(@Body body: FormBody): Response> - @POST("guest_queries_store") + @POST("user_queries_store") suspend fun supportForUser(@Body body: FormBody): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/woka/modules/ModuleRepository.kt b/app/src/main/java/com/woka/modules/ModuleRepository.kt index 764aa62..f01384c 100644 --- a/app/src/main/java/com/woka/modules/ModuleRepository.kt +++ b/app/src/main/java/com/woka/modules/ModuleRepository.kt @@ -23,7 +23,7 @@ object ModuleRepository { suspend fun supportForUser(userId: String, subject: String, message: String): ApiResult { return RetrofitHelper.handleApiCall { - moduleApiService.supportForGuest( + moduleApiService.supportForUser( FormBody.Builder() .add("user_id", userId) .add("subject", subject) diff --git a/app/src/main/java/com/woka/mvvm/UserApiService.kt b/app/src/main/java/com/woka/mvvm/UserApiService.kt deleted file mode 100644 index e838f39..0000000 --- a/app/src/main/java/com/woka/mvvm/UserApiService.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.woka.mvvm - -import com.woka.mvvm.userDataModels.UserDataResponse -import com.woka.networking.ApiResponse -import retrofit2.Response -import retrofit2.http.GET - -interface UserApiService { - - @GET("get_user_data") - suspend fun getUserData(): Response> - - @GET("user_logout") - suspend fun logout(): Response> -} \ No newline at end of file diff --git a/app/src/main/java/com/woka/mvvm/UserRepository.kt b/app/src/main/java/com/woka/mvvm/UserRepository.kt deleted file mode 100644 index ba7b66d..0000000 --- a/app/src/main/java/com/woka/mvvm/UserRepository.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.woka.mvvm - -import com.woka.mvvm.userDataModels.UserDataResponse -import com.woka.networking.ApiResult -import com.woka.networking.RetrofitHelper.handleApiCall - -class UserRepository(private val userApiService: UserApiService) { - - suspend fun getUserData(): ApiResult{ - return handleApiCall{ - userApiService.getUserData() - } - } - - suspend fun logout(): ApiResult{ - return handleApiCall { - userApiService.logout() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/OnboardActivity.kt b/app/src/main/java/com/woka/onboard/OnboardActivity.kt index 0ce9797..d0bb162 100644 --- a/app/src/main/java/com/woka/onboard/OnboardActivity.kt +++ b/app/src/main/java/com/woka/onboard/OnboardActivity.kt @@ -8,6 +8,13 @@ import androidx.core.view.WindowInsetsCompat import androidx.navigation.NavOptions import androidx.navigation.fragment.NavHostFragment import com.woka.R +import com.woka.WokaApp.Companion.userPrefs +import com.woka.onboard.fragments.GetCodeFragment +import com.woka.onboard.fragments.GetCodeFragment.Companion.EMAIL_ARG +import com.woka.onboard.fragments.GetEmailFragment +import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16 +import com.woka.onboard.fragments.SignUpFragment +import com.woka.onboard.fragments.SignUpFragment.Companion.ADD_CHILD_EVENT import com.woka.utils.WokaBaseActivity class OnboardActivity : WokaBaseActivity() { @@ -16,6 +23,8 @@ class OnboardActivity : WokaBaseActivity() { const val ONBOARD_ACTIVITY_INTENT = "onboard_act_intent" const val LOG_IN_INTENT = "login_intent" + + const val ADD_CHILD_INTENT = "add_child_intent" } private var player: MediaPlayer? = null @@ -40,6 +49,20 @@ class OnboardActivity : WokaBaseActivity() { .setPopUpTo(R.id.onboardFragment, true) .build() ) + }else if (intent.getStringExtra(ONBOARD_ACTIVITY_INTENT) == ADD_CHILD_INTENT){ + val hostFragment = + supportFragmentManager.findFragmentById(R.id.fc_onboard) as NavHostFragment + hostFragment.navController.navigate( + R.id.action_onboardFragment_to_signUpFragment, + Bundle().apply { + putBoolean(IS_UNDER_16, true) + putString(EMAIL_ARG, userPrefs?.userData?.email) + putBoolean(ADD_CHILD_EVENT, true) + }, + NavOptions.Builder() + .setPopUpTo(R.id.onboardFragment, true) + .build() + ) } player = MediaPlayer.create(this, R.raw.audiotwo) diff --git a/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt index 86c1688..242e3d7 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt @@ -9,20 +9,26 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.databinding.FragmentSelectAvatarBinding import com.woka.home.HomeActivity import com.woka.networking.ApiResult +import com.woka.networking.RetrofitHelper import com.woka.onboard.AvatarAdapter import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16 import com.woka.onboard.models.Avatar import com.woka.onboard.models.RegisterRequestData import com.woka.onboard.mvvm.OnboardViewModel +import com.woka.userdata.UserRepository import com.woka.utils.Gender import com.woka.utils.ProgressView import com.woka.utils.UserType import com.woka.utils.toast +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Locale @@ -47,7 +53,7 @@ class SelectAvatarFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { binding = FragmentSelectAvatarBinding.inflate(inflater, container, false) activity?.let { viewModel = ViewModelProvider(it)[OnboardViewModel::class.java] @@ -133,23 +139,32 @@ class SelectAvatarFragment : Fragment() { progressView.show(getString(R.string.please_wait)) } is ApiResult.Success -> { - progressView.hide() + activity?.let {activity -> toast(it.message) it.data?.result?.let { result-> + lifecycleScope.launch { + // logging out + if (userPrefs?.userType == UserType.GUARDIAN || userPrefs?.userType == UserType.CHILD){ + progressView.show(getString(R.string.logging_you_out)) + UserRepository.logout() + } - // saving to user prefs - userPrefs?.accessToken = result.remember_token?:"no_token_received" - userPrefs?.userType = UserType.createUserType(result.user_type) + // saving to user prefs + userPrefs?.accessToken = result.remember_token?:"no_token_received" + userPrefs?.userType = UserType.createUserType(result.user_type) - userPrefs?.loadUserData() + userPrefs?.loadUserData() - startActivity(Intent(activity, HomeActivity::class.java).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - }) - activity.finish() + progressView.hide() + startActivity(Intent(activity, HomeActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + }) + activity.finish() + } } + progressView.hide() } } null -> {} 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 232ae42..67979a5 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt @@ -33,6 +33,8 @@ class SignInFragment : Fragment() { private lateinit var dialog: DecisionDialog + private lateinit var deactivatedDialog: DecisionDialog + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -59,6 +61,21 @@ class SignInFragment : Fragment() { setNegativeButton(getString(R.string.no)) } + + deactivatedDialog = DecisionDialog(it).apply { + title = getString(R.string.activate_woka_account) + message = getString(R.string.would_you_like_to_re_activate_your_account) + + setPositiveButton(getString(R.string.yes)){ + viewModel.loginProceed( + binding.username.text.toString(), + binding.password.text.toString(), + true + ) + } + + setNegativeButton(getString(R.string.no)) + } } clickEvents() @@ -80,7 +97,9 @@ class SignInFragment : Fragment() { is ApiResult.Success -> { progressView.hide() it.data?.result?.let {data-> - if (data.already_logged_in){ + if (data.is_deactive){ + deactivatedDialog.show() + }else if (data.already_logged_in){ dialog.show() }else{ toast(it.message) diff --git a/app/src/main/java/com/woka/onboard/fragments/SignUpFragment.kt b/app/src/main/java/com/woka/onboard/fragments/SignUpFragment.kt index a7430ce..ebf6bf4 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SignUpFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SignUpFragment.kt @@ -1,5 +1,6 @@ package com.woka.onboard.fragments +import android.graphics.Color import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater @@ -20,13 +21,26 @@ import com.woka.utils.PARENT_TYPE import com.woka.utils.ProgressView import com.woka.utils.toast +/* + This fragment is opened for two intents + + 1. The normal registration flow + 2. Adding child from home + + */ class SignUpFragment : Fragment() { + companion object{ + const val ADD_CHILD_EVENT = "add_child_event" + } + private lateinit var binding: FragmentSignUpBinding private var isUnder16 = false private var email: String? = null + private var addChildIntent = false + private lateinit var viewModel: OnboardViewModel private lateinit var progressView: ProgressView @@ -35,6 +49,7 @@ class SignUpFragment : Fragment() { arguments?.let { isUnder16 = it.getBoolean(IS_UNDER_16, false) email = it.getString(EMAIL_ARG) + addChildIntent = it.getBoolean(ADD_CHILD_EVENT, false) } } @@ -47,6 +62,7 @@ class SignUpFragment : Fragment() { activity?.let { viewModel = ViewModelProvider(it)[OnboardViewModel::class.java] progressView = ProgressView(it) + it.window?.statusBarColor = Color.parseColor("#6ed5fe") } initViews() @@ -101,13 +117,22 @@ class SignUpFragment : Fragment() { private fun initViews() { binding.apply { - if (isUnder16) { + if (isUnder16 && !addChildIntent) { doNotShare.visibility = VISIBLE } name.setText(viewModel.name) username.setText(viewModel.userName) password.setText(viewModel.password) + + if (addChildIntent){ + title.text = getString(R.string.add_child_account) + usernameTitle.text = getString(R.string.username) + nameTitle.text = getString(R.string.child_name) + passwordTitle.text = getString(R.string.password) + + viewModel.email = email + } } } 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 f903bb7..1c20e24 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SplashFragment.kt @@ -4,12 +4,9 @@ import android.animation.Animator import android.content.Intent import android.media.MediaPlayer import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.animation.Animation -import android.view.animation.Animation.AnimationListener import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope @@ -19,9 +16,8 @@ import com.woka.R import com.woka.WokaApp.Companion.userPrefs import com.woka.databinding.FragmentSplashBinding import com.woka.home.HomeActivity -import com.woka.mvvm.userDataModels.UserDataResponse +import com.woka.userdata.userDataModels.UserDataResponse import com.woka.networking.ApiResult -import com.woka.utils.TAG import com.woka.utils.UserType import com.woka.utils.toast import kotlinx.coroutines.delay diff --git a/app/src/main/java/com/woka/onboard/models/LoginResponse.kt b/app/src/main/java/com/woka/onboard/models/LoginResponse.kt index c30c67f..d40f9d0 100644 --- a/app/src/main/java/com/woka/onboard/models/LoginResponse.kt +++ b/app/src/main/java/com/woka/onboard/models/LoginResponse.kt @@ -1,6 +1,6 @@ package com.woka.onboard.models -import com.woka.mvvm.userDataModels.UserData +import com.woka.userdata.userDataModels.UserData data class LoginResponse( val result: UserData? diff --git a/app/src/main/java/com/woka/onboard/models/RegisterResponse.kt b/app/src/main/java/com/woka/onboard/models/RegisterResponse.kt index 827e42c..6212f95 100644 --- a/app/src/main/java/com/woka/onboard/models/RegisterResponse.kt +++ b/app/src/main/java/com/woka/onboard/models/RegisterResponse.kt @@ -1,6 +1,6 @@ package com.woka.onboard.models -import com.woka.mvvm.userDataModels.UserData +import com.woka.userdata.userDataModels.UserData data class RegisterResponse( val result: UserData 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 c18bf3f..65627e2 100644 --- a/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt +++ b/app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt @@ -33,12 +33,13 @@ class OnboardRepository(private val apiService: OnboardApiService) { } } - suspend fun loginProceed(userName: String, password: String): ApiResult { + suspend fun loginProceed(userName: String, password: String, isActivate: Boolean): ApiResult { return handleApiCall { apiService.loginProceed( FormBody.Builder() .add("username", userName) .add("password", password) + .add("is_activate", if (isActivate) "1" else "0") .build() ) } 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 cb28cd3..cdc792f 100644 --- a/app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt +++ b/app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt @@ -141,10 +141,10 @@ class OnboardViewModel: ViewModel(){ } } - fun loginProceed(userName: String, password: String){ + fun loginProceed(userName: String, password: String, isActivate: Boolean = false){ viewModelScope.launch { _loginProceedLiveData.postValue(ApiResult.Loading()) - val response = repository.loginProceed(userName, password) + val response = repository.loginProceed(userName, password, isActivate) _loginProceedLiveData.postValue(response) } } diff --git a/app/src/main/java/com/woka/userPreference/UserPreference.kt b/app/src/main/java/com/woka/userPreference/UserPreference.kt index 5c78152..7720199 100644 --- a/app/src/main/java/com/woka/userPreference/UserPreference.kt +++ b/app/src/main/java/com/woka/userPreference/UserPreference.kt @@ -4,17 +4,14 @@ import android.annotation.SuppressLint import android.content.Context import android.content.Context.MODE_PRIVATE import android.content.SharedPreferences -import android.provider.Settings import android.provider.Settings.Secure import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.woka.home.Theme -import com.woka.mvvm.UserApiService -import com.woka.mvvm.UserRepository -import com.woka.mvvm.userDataModels.UserData -import com.woka.mvvm.userDataModels.UserDataResponse import com.woka.networking.ApiResult -import com.woka.networking.RetrofitHelper +import com.woka.userdata.UserRepository +import com.woka.userdata.userDataModels.UserData +import com.woka.userdata.userDataModels.UserDataResponse import com.woka.utils.UserType import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -38,6 +35,27 @@ class UserPreference(context: Context) { val deviceId: String = Secure.getString(context.contentResolver, Secure.ANDROID_ID) var userData: UserData? = null + private set + + fun updateUserData(userData: UserData?){ + when (val currentData = userLiveData.value){ + is ApiResult.Error -> {} + is ApiResult.Loading -> {} + is ApiResult.Success -> { + _userLiveData.postValue( + ApiResult.Success( + UserDataResponse( + userData, + currentData.data?.userNotificationsCount + ) + ) + ) + + this.userData = userData + } + null -> {} + } + } var appLanguage: String get() = userPrefs.getString(APP_LANGUAGE, "en") ?: "en" @@ -58,9 +76,6 @@ class UserPreference(context: Context) { get() = userPrefs.getString(GUEST_USER_NAME, null) set(value) = userPrefs.edit().putString(GUEST_USER_NAME, value).apply() - private val userRepository = - UserRepository(RetrofitHelper.getRetrofit().create(UserApiService::class.java)) - private val _userLiveData = MutableLiveData?>() val userLiveData: LiveData?> get() = _userLiveData @@ -68,7 +83,7 @@ class UserPreference(context: Context) { fun loadUserData() { CoroutineScope(Dispatchers.IO).launch { _userLiveData.postValue(ApiResult.Loading()) - val result = userRepository.getUserData() + val result = UserRepository.getUserData() when (result){ is ApiResult.Error -> {} diff --git a/app/src/main/java/com/woka/userdata/UserApiService.kt b/app/src/main/java/com/woka/userdata/UserApiService.kt new file mode 100644 index 0000000..608fae6 --- /dev/null +++ b/app/src/main/java/com/woka/userdata/UserApiService.kt @@ -0,0 +1,24 @@ +package com.woka.userdata + +import com.woka.userdata.userDataModels.UserDataResponse +import com.woka.networking.ApiResponse +import okhttp3.FormBody +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST + +interface UserApiService { + + @GET("get_user_data") + suspend fun getUserData(): Response> + + @GET("user_logout") + suspend fun logout(): Response> + + @POST("update_profile") + suspend fun updateProfile(@Body formBody: FormBody): Response> + + @GET("user_deactivate_account") + suspend fun deActivateAccount(): Response> +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/userdata/UserRepository.kt b/app/src/main/java/com/woka/userdata/UserRepository.kt new file mode 100644 index 0000000..380d33f --- /dev/null +++ b/app/src/main/java/com/woka/userdata/UserRepository.kt @@ -0,0 +1,42 @@ +package com.woka.userdata + +import com.woka.userdata.userDataModels.UserDataResponse +import com.woka.networking.ApiResult +import com.woka.networking.RetrofitHelper +import com.woka.networking.RetrofitHelper.handleApiCall +import okhttp3.FormBody + +object UserRepository { + + private val userApiService = RetrofitHelper.getRetrofit().create(UserApiService::class.java) + + suspend fun getUserData(): ApiResult{ + return handleApiCall{ + userApiService.getUserData() + } + } + + suspend fun logout(): ApiResult{ + return handleApiCall { + userApiService.logout() + } + } + + suspend fun updateProfile(name: String, email: String, gender: String): ApiResult{ + return handleApiCall { + userApiService.updateProfile( + FormBody.Builder() + .add("fullname", name) + .add("email", email) + .add("gender", gender) + .build() + ) + } + } + + suspend fun deActivateAccount(): ApiResult{ + return handleApiCall { + userApiService.deActivateAccount() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/ChildDetail.kt b/app/src/main/java/com/woka/userdata/userDataModels/ChildDetail.kt similarity index 77% rename from app/src/main/java/com/woka/mvvm/userDataModels/ChildDetail.kt rename to app/src/main/java/com/woka/userdata/userDataModels/ChildDetail.kt index 02a6e68..3ee163b 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/ChildDetail.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/ChildDetail.kt @@ -1,4 +1,4 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class ChildDetail( val avatar_name: String?, diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/Gender.kt b/app/src/main/java/com/woka/userdata/userDataModels/Gender.kt similarity index 61% rename from app/src/main/java/com/woka/mvvm/userDataModels/Gender.kt rename to app/src/main/java/com/woka/userdata/userDataModels/Gender.kt index a63687d..8d93a93 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/Gender.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/Gender.kt @@ -1,4 +1,4 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class Gender( val gender_name: String?, diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/InterestTopic.kt b/app/src/main/java/com/woka/userdata/userDataModels/InterestTopic.kt similarity index 63% rename from app/src/main/java/com/woka/mvvm/userDataModels/InterestTopic.kt rename to app/src/main/java/com/woka/userdata/userDataModels/InterestTopic.kt index 715954f..d35aa8a 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/InterestTopic.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/InterestTopic.kt @@ -1,4 +1,4 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class InterestTopic( val id: Int?, diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/Language.kt b/app/src/main/java/com/woka/userdata/userDataModels/Language.kt similarity index 62% rename from app/src/main/java/com/woka/mvvm/userDataModels/Language.kt rename to app/src/main/java/com/woka/userdata/userDataModels/Language.kt index 03e445e..f76c060 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/Language.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/Language.kt @@ -1,4 +1,4 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class Language( val id: Int?, diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/UserData.kt b/app/src/main/java/com/woka/userdata/userDataModels/UserData.kt similarity index 86% rename from app/src/main/java/com/woka/mvvm/userDataModels/UserData.kt rename to app/src/main/java/com/woka/userdata/userDataModels/UserData.kt index fe39ab0..61972ac 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/UserData.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/UserData.kt @@ -1,7 +1,8 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class UserData( val already_logged_in: Boolean, + val is_deactive: Boolean, val avtar: String?, val birthdate: String?, val child_detail: ChildDetail?, diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/UserDataResponse.kt b/app/src/main/java/com/woka/userdata/userDataModels/UserDataResponse.kt similarity index 78% rename from app/src/main/java/com/woka/mvvm/userDataModels/UserDataResponse.kt rename to app/src/main/java/com/woka/userdata/userDataModels/UserDataResponse.kt index 3915879..c3b5d30 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/UserDataResponse.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/UserDataResponse.kt @@ -1,4 +1,4 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class UserDataResponse( val result: UserData?, diff --git a/app/src/main/java/com/woka/mvvm/userDataModels/UserNotificationData.kt b/app/src/main/java/com/woka/userdata/userDataModels/UserNotificationData.kt similarity index 89% rename from app/src/main/java/com/woka/mvvm/userDataModels/UserNotificationData.kt rename to app/src/main/java/com/woka/userdata/userDataModels/UserNotificationData.kt index aa1d3c1..d43364a 100644 --- a/app/src/main/java/com/woka/mvvm/userDataModels/UserNotificationData.kt +++ b/app/src/main/java/com/woka/userdata/userDataModels/UserNotificationData.kt @@ -1,4 +1,4 @@ -package com.woka.mvvm.userDataModels +package com.woka.userdata.userDataModels data class UserNotificationData( val created_at: String?, diff --git a/app/src/main/java/com/woka/utils/Gender.kt b/app/src/main/java/com/woka/utils/Gender.kt index 78a930c..f30bffe 100644 --- a/app/src/main/java/com/woka/utils/Gender.kt +++ b/app/src/main/java/com/woka/utils/Gender.kt @@ -1,5 +1,5 @@ package com.woka.utils -enum class Gender(value: Int){ +enum class Gender(val value: Int){ MALE(0), FEMALE(1), NONE(-1) } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_pen.xml b/app/src/main/res/drawable/ic_pen.xml new file mode 100644 index 0000000..7db1006 --- /dev/null +++ b/app/src/main/res/drawable/ic_pen.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 0321101..71d4c4b 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -452,68 +452,101 @@ - - android:visibility="gone" + - android:foreground="?android:attr/selectableItemBackground" - /> + - - android:visibility="gone" + - android:foreground="?android:attr/selectableItemBackground" - /> + - - android:visibility="gone" + - android:foreground="?android:attr/selectableItemBackground" - /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +