From 43565249d8094262307ea00894cd4aa4de4d06a9 Mon Sep 17 00:00:00 2001 From: AdityaGaikwad Date: Thu, 2 May 2024 19:31:36 +0530 Subject: [PATCH] Avatars Screen Login flow ui forget password ui --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 2 +- .../java/com/woka/onboard/AvatarAdapter.kt | 61 +++++ .../woka/onboard/fragments/GetCodeFragment.kt | 46 ++-- .../onboard/fragments/GetEmailFragment.kt | 32 ++- .../onboard/fragments/GetMoreInfoFragment.kt | 5 + .../onboard/fragments/NewPasswordFragment.kt | 31 +++ .../woka/onboard/fragments/OnboardFragment.kt | 17 +- .../onboard/fragments/SelectAvatarFragment.kt | 68 +++++- .../woka/onboard/fragments/SignInFragment.kt | 19 ++ .../java/com/woka/onboard/models/Avatar.kt | 7 + app/src/main/res/layout/avatar_viewholder.xml | 23 ++ .../res/layout/fragment_get_more_info.xml | 2 +- .../main/res/layout/fragment_new_password.xml | 208 ++++++++++++++++ .../res/layout/fragment_select_avatar.xml | 5 +- app/src/main/res/layout/fragment_sign_in.xml | 230 +++++++++++++++++- app/src/main/res/layout/fragment_sign_up.xml | 1 + .../main/res/navigation/nav_graph_onboard.xml | 31 +++ app/src/main/res/values-hi/strings.xml | 14 ++ app/src/main/res/values/strings.xml | 13 + 20 files changed, 782 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/woka/onboard/AvatarAdapter.kt create mode 100644 app/src/main/java/com/woka/onboard/fragments/NewPasswordFragment.kt create mode 100644 app/src/main/java/com/woka/onboard/models/Avatar.kt create mode 100644 app/src/main/res/layout/avatar_viewholder.xml create mode 100644 app/src/main/res/layout/fragment_new_password.xml diff --git a/app/build.gradle b/app/build.gradle index 39eb805..60e2727 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,6 +42,8 @@ dependencies { implementation 'com.google.android.flexbox:flexbox:3.0.0' + implementation 'com.github.bumptech.glide:glide:4.16.0' + implementation libs.androidx.core.ktx implementation libs.androidx.appcompat implementation libs.material diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a9bb014..ae4f024 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,7 +18,7 @@ ) : + RecyclerView.Adapter() { + + var selectedPos: Int? = null + + inner class AvatarViewHolder(val binding: AvatarViewholderBinding) : ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AvatarViewHolder { + return AvatarViewHolder( + AvatarViewholderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun getItemCount(): Int = avatarList.size + + override fun onBindViewHolder(holder: AvatarViewHolder, position: Int) { + Glide.with(holder.binding.root) + .load(avatarList[position].avatar_image_url) + .into(holder.binding.avatar) + + holder.binding.card.apply { + if (selectedPos == position){ + cardElevation = 5f + setCardBackgroundColor(holder.itemView.context.getColor(R.color.white)) + }else{ + cardElevation = 0f + setCardBackgroundColor(holder.itemView.context.getColor(R.color.white_50)) + } + } + + holder.binding.card.setOnClickListener { + if (selectedPos == position) return@setOnClickListener + + holder.binding.card.apply { + setCardBackgroundColor(holder.itemView.context.getColor(R.color.white)) + cardElevation = 5f + } + + selectedPos?.let { + notifyItemChanged(it) + } + selectedPos = position + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/fragments/GetCodeFragment.kt b/app/src/main/java/com/woka/onboard/fragments/GetCodeFragment.kt index 369c9f9..f79f55a 100644 --- a/app/src/main/java/com/woka/onboard/fragments/GetCodeFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/GetCodeFragment.kt @@ -9,19 +9,29 @@ import androidx.core.widget.addTextChangedListener import androidx.navigation.fragment.findNavController import com.woka.R import com.woka.databinding.FragmentGetCodeBinding +import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_RESET_PASSWORD_INTENT import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_UNDER_16 import com.woka.utils.closeKeyboard +/* + This fragment is to get the otp code input + It is used in three scenarios: + 1 (Default). Registration process of parent (@Param isUnder16 = false) + 2. Registration process of child (@Param isUnder16 = true) + 3. Forget password process ( @Param isResetPasswordIntent = true) + */ class GetCodeFragment : Fragment() { private lateinit var binding: FragmentGetCodeBinding - private var isUnder16 = false + private var isUnder16: Boolean = false + private var isResetPasswordIntent: 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) } } @@ -40,6 +50,15 @@ class GetCodeFragment : Fragment() { private fun initViews() { binding.apply { + if (isResetPasswordIntent){ + title.text = getString(R.string.please_get_otp_under_16) + infoText.text = getString(R.string.request_them_for_the_code_to_reset_your_password) + } + else if (isUnder16){ + title.text = getString(R.string.please_get_otp_under_16) + infoText.text = getString(R.string.request_them_for_verification_) + } + et1.addTextChangedListener { if (it?.isEmpty() == false){ et2.requestFocus() @@ -70,19 +89,6 @@ class GetCodeFragment : Fragment() { et3.requestFocus() } } - - if (isUnder16){ - title.text = getString(R.string.please_get_otp_under_16) - infoText.text = getString(R.string.request_them_for_verification_) - } - - binding.next.setOnClickListener { - val args = Bundle().apply { - putBoolean(IS_UNDER_16, isUnder16) - } - - findNavController().navigate(R.id.action_getCodeFragment_to_signUpFragment, args) - } } } @@ -91,6 +97,18 @@ class GetCodeFragment : Fragment() { backBtn.setOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() } + + next.setOnClickListener { + if (isResetPasswordIntent){ + findNavController().navigate(R.id.action_getCodeFragment_to_newPasswordFragment2) + }else{ + val args = Bundle().apply { + putBoolean(IS_UNDER_16, isUnder16) + } + + findNavController().navigate(R.id.action_getCodeFragment_to_signUpFragment, args) + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/fragments/GetEmailFragment.kt b/app/src/main/java/com/woka/onboard/fragments/GetEmailFragment.kt index 01994cd..bb3b229 100644 --- a/app/src/main/java/com/woka/onboard/fragments/GetEmailFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/GetEmailFragment.kt @@ -12,20 +12,30 @@ import androidx.navigation.fragment.findNavController import com.woka.R import com.woka.databinding.FragmentGetEmailBinding +/* + This fragment is to get the email user input + It is used in three scenarios: + 1 (Default). Registration process of parent (@Param isUnder16 = false) + 2. Registration process of child (@Param isUnder16 = true) + 3. Forget password process ( @Param isResetPasswordIntent = true) + */ class GetEmailFragment : Fragment() { companion object{ const val IS_UNDER_16 = "is_under_16" + const val IS_RESET_PASSWORD_INTENT = "reset_password_intent" } private lateinit var binding: FragmentGetEmailBinding private var isUnder16: Boolean = false + private var isResetPasswordIntent: 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) } } @@ -44,7 +54,17 @@ class GetEmailFragment : Fragment() { private fun initViews() { binding.apply { - if (isUnder16){ + if (isResetPasswordIntent){ + // scenario 3 + + title.text = getString(R.string.forgot_your_password) + can.text = getString(R.string.please_give_us_your_username) + email.hint = getString(R.string.enter_your_username) + verificationTxt.text = getString(R.string.we_will_send_a_reset_code_to_your_parent_s_email) + verificationTxt.visibility = VISIBLE + }else if (isUnder16){ + // scenario 2 + title.text = getString(R.string.let_s_be_safe) can.text = getString(R.string.can_we_have_your_parent_s_email) email.hint = getString(R.string.enter_your_parent_s_email) @@ -62,8 +82,14 @@ class GetEmailFragment : Fragment() { return@setOnClickListener } - val args = Bundle().apply { - putBoolean(IS_UNDER_16, isUnder16) + val args = if (isResetPasswordIntent){ + Bundle().apply { + putBoolean(IS_RESET_PASSWORD_INTENT, isResetPasswordIntent) + } + }else{ + Bundle().apply { + putBoolean(IS_UNDER_16, isUnder16) + } } findNavController().navigate(R.id.action_getEmailFragment_to_getCodeFragment, args) diff --git a/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt b/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt index fe0f6dc..da7a480 100644 --- a/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/GetMoreInfoFragment.kt @@ -10,6 +10,7 @@ import android.widget.TextView import android.widget.Toast import androidx.core.view.allViews import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController import com.woka.R import com.woka.databinding.FragmentGetMoreInfoBinding import com.woka.onboard.InterestTopicView @@ -53,6 +54,10 @@ class GetMoreInfoFragment : Fragment() { genderF.setOnClickListener{selectGender(Gender.FEMALE)} backBtn.setOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() } + + next.setOnClickListener { + findNavController().navigate(R.id.action_getMoreInfoFragment_to_selectAvatarFragment) + } } } diff --git a/app/src/main/java/com/woka/onboard/fragments/NewPasswordFragment.kt b/app/src/main/java/com/woka/onboard/fragments/NewPasswordFragment.kt new file mode 100644 index 0000000..677f5c9 --- /dev/null +++ b/app/src/main/java/com/woka/onboard/fragments/NewPasswordFragment.kt @@ -0,0 +1,31 @@ +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 com.woka.R +import com.woka.databinding.FragmentNewPasswordBinding + +class NewPasswordFragment : Fragment() { + + private lateinit var binding: FragmentNewPasswordBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentNewPasswordBinding.inflate(inflater, container, false) + clickEvents() + return binding.root + } + + private fun clickEvents() { + binding.apply { + backBtn.setOnClickListener { + activity?.onBackPressedDispatcher?.onBackPressed() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt b/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt index a7f782e..ab9605e 100644 --- a/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/OnboardFragment.kt @@ -49,12 +49,19 @@ class OnboardFragment : Fragment() { } private fun clickEvents(){ - binding.backBtn.setOnClickListener{ - activity?.onBackPressedDispatcher?.onBackPressed() - } - binding.createAccount.setOnClickListener { - findNavController().navigate(R.id.action_onboardFragment_to_age_select_fragment) + binding.apply { + backBtn.setOnClickListener{ + activity?.onBackPressedDispatcher?.onBackPressed() + } + + createAccount.setOnClickListener { + findNavController().navigate(R.id.action_onboardFragment_to_age_select_fragment) + } + + login.setOnClickListener { + findNavController().navigate(R.id.action_onboardFragment_to_signInFragment) + } } } } \ No newline at end of file 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 20d736e..7c00378 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SelectAvatarFragment.kt @@ -5,19 +5,83 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.woka.R +import android.widget.Toast import com.woka.databinding.FragmentSelectAvatarBinding +import com.woka.onboard.AvatarAdapter +import com.woka.onboard.models.Avatar class SelectAvatarFragment : Fragment() { private lateinit var binding: FragmentSelectAvatarBinding + private var adapter: AvatarAdapter? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = FragmentSelectAvatarBinding.inflate(inflater, container, false) - + clickEvents() return binding.root } + + private fun clickEvents() { + binding.apply { + backBtn.setOnClickListener { + activity?.onBackPressedDispatcher?.onBackPressed() + } + + next.setOnClickListener { + if (adapter?.selectedPos == null){ + Toast.makeText(activity, "Please select an avatar", Toast.LENGTH_SHORT).show() + return@setOnClickListener + } + Toast.makeText(activity, "${adapter?.avatarList?.get(adapter?.selectedPos!!)?.id}", Toast.LENGTH_SHORT).show() + } + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + // static avatars + adapter = AvatarAdapter( + listOf( + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar1.png?d=1714636151", + "1", 1 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar2.png?d=1714636151", + "2", 2 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar3.png?d=1714636151", + "1", 3 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar4.png?d=1714636151", + "2", 4 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar1.png?d=1714636151", + "1", 5 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar2.png?d=1714636151", + "2", 6 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar3.png?d=1714636151", + "1", 7 + ), + Avatar( + "https://wokastaging.in/storage/app/public/uploads/avtar/avatar4.png?d=1714636151", + "2", 8 + ) + ) + ) + + binding.rvAvatar.adapter = adapter + + } } \ 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 258c1ae..a556a36 100644 --- a/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt +++ b/app/src/main/java/com/woka/onboard/fragments/SignInFragment.kt @@ -1,12 +1,16 @@ package com.woka.onboard.fragments +import android.graphics.Color import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.WindowManager +import androidx.navigation.fragment.findNavController import com.woka.R import com.woka.databinding.FragmentSignInBinding +import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_RESET_PASSWORD_INTENT class SignInFragment : Fragment() { @@ -19,6 +23,8 @@ class SignInFragment : Fragment() { savedInstanceState: Bundle? ): View? { binding = FragmentSignInBinding.inflate(inflater, container, false) + activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + activity?.window?.statusBarColor = Color.parseColor("#6ed5fe") clickEvents() @@ -27,7 +33,20 @@ class SignInFragment : Fragment() { private fun clickEvents() { binding.apply { + forgotPassword.setOnClickListener { + findNavController().navigate(R.id.action_signInFragment_to_getEmailFragment, + Bundle().apply { + putBoolean(IS_RESET_PASSWORD_INTENT, true) + }) + } + backBtn.setOnClickListener { + activity?.onBackPressedDispatcher?.onBackPressed() + } + + createAccount.setOnClickListener { + findNavController().navigate(R.id.action_signInFragment_to_age_select_fragment) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/onboard/models/Avatar.kt b/app/src/main/java/com/woka/onboard/models/Avatar.kt new file mode 100644 index 0000000..f532047 --- /dev/null +++ b/app/src/main/java/com/woka/onboard/models/Avatar.kt @@ -0,0 +1,7 @@ +package com.woka.onboard.models + +data class Avatar( + val avatar_image_url: String, + val avatar_name: String, + val id: Int +) \ No newline at end of file diff --git a/app/src/main/res/layout/avatar_viewholder.xml b/app/src/main/res/layout/avatar_viewholder.xml new file mode 100644 index 0000000..9066863 --- /dev/null +++ b/app/src/main/res/layout/avatar_viewholder.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_get_more_info.xml b/app/src/main/res/layout/fragment_get_more_info.xml index eec83d4..e11e76b 100644 --- a/app/src/main/res/layout/fragment_get_more_info.xml +++ b/app/src/main/res/layout/fragment_get_more_info.xml @@ -202,7 +202,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +