From 3d69006b1e5bd426c3b3470d49b6d9018b82f4e9 Mon Sep 17 00:00:00 2001 From: Gideon Okuro Date: Tue, 25 Feb 2025 17:47:03 +0300 Subject: [PATCH 1/5] focus in age and gender in team survey --- .../planet/myplanet/model/RealmUserModel.kt | 3 + .../ui/dashboard/BaseDashboardFragment.kt | 2 +- .../myplanet/ui/exam/BaseExamFragment.kt | 2 +- .../ui/exam/UserInformationFragment.kt | 239 +++++++++++++----- .../res/layout/fragment_user_information.xml | 80 ++++-- app/src/main/res/values-ar/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-ne/strings.xml | 2 + app/src/main/res/values-so/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 11 files changed, 253 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/org/ole/planet/myplanet/model/RealmUserModel.kt b/app/src/main/java/org/ole/planet/myplanet/model/RealmUserModel.kt index 8a9e33616b..6aed87cbd4 100644 --- a/app/src/main/java/org/ole/planet/myplanet/model/RealmUserModel.kt +++ b/app/src/main/java/org/ole/planet/myplanet/model/RealmUserModel.kt @@ -48,6 +48,7 @@ open class RealmUserModel : RealmObject() { var gender: String? = null var salt: String? = null var dob: String? = null + var age: String? = null var birthPlace: String? = null var userImage: String? = null var key: String? = null @@ -87,6 +88,7 @@ open class RealmUserModel : RealmObject() { jsonObject.addProperty("gender", gender) jsonObject.addProperty("phoneNumber", phoneNumber) jsonObject.addProperty("birthDate", dob) + jsonObject.addProperty("age", age) try { jsonObject.addProperty("iterations", iterations?.toInt()) } catch (e: Exception) { @@ -263,6 +265,7 @@ open class RealmUserModel : RealmObject() { salt = JsonUtils.getString("salt", jsonDoc) dob = JsonUtils.getString("birthDate", jsonDoc) birthPlace = JsonUtils.getString("birthPlace", jsonDoc) + age = JsonUtils.getString("age", jsonDoc) gender = JsonUtils.getString("gender", jsonDoc) language = JsonUtils.getString("language", jsonDoc) level = JsonUtils.getString("level", jsonDoc) diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt index efb67ae964..2880f11174 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt @@ -73,7 +73,7 @@ open class BaseDashboardFragment : BaseDashboardFragmentPlugin(), NotificationCa v.findViewById(R.id.ll_prompt).visibility = View.VISIBLE v.findViewById(R.id.ll_prompt).setOnClickListener { if (!childFragmentManager.isStateSaved) { - UserInformationFragment.getInstance("", "").show(childFragmentManager, "") + UserInformationFragment.getInstance("", "", false).show(childFragmentManager, "") } } } else { diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/exam/BaseExamFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/exam/BaseExamFragment.kt index b0986ae8a7..387719fcfe 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/exam/BaseExamFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/exam/BaseExamFragment.kt @@ -138,7 +138,7 @@ abstract class BaseExamFragment : Fragment(), ImageCaptureCallback { private fun showUserInfoDialog() { if (!isMySurvey && !exam?.isFromNation!!) { - UserInformationFragment.getInstance(sub?.id, teamId).show(childFragmentManager, "") + UserInformationFragment.getInstance(sub?.id, teamId, !isMySurvey && !exam?.isFromNation!!).show(childFragmentManager, "") } else { if (!mRealm.isInTransaction) mRealm.beginTransaction() sub?.status = "complete" diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/exam/UserInformationFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/exam/UserInformationFragment.kt index af5353e422..6440a6a055 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/exam/UserInformationFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/exam/UserInformationFragment.kt @@ -4,6 +4,7 @@ import android.app.DatePickerDialog import android.content.DialogInterface import android.os.Bundle import android.text.TextUtils +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -33,6 +34,7 @@ class UserInformationFragment : BaseDialogFragment(), View.OnClickListener { lateinit var mRealm: Realm private var submissions: RealmSubmission? = null var userModel: RealmUserModel? = null + var shouldHideElements: Boolean? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { fragmentUserInformationBinding = FragmentUserInformationBinding.inflate(inflater, container, false) @@ -41,41 +43,52 @@ class UserInformationFragment : BaseDialogFragment(), View.OnClickListener { if (!TextUtils.isEmpty(id)) { submissions = mRealm.where(RealmSubmission::class.java).equalTo("id", id).findFirst() } + shouldHideElements = arguments?.getBoolean("shouldHideElements") == true initViews() return fragmentUserInformationBinding.root } private fun initViews() { - val langArray = resources.getStringArray(R.array.language).toMutableList() - val levelArray = resources.getStringArray(R.array.level).toMutableList() - val adapterLang = ArrayAdapter(requireContext(), R.layout.spinner_item_white, langArray) - val adapterLevel = ArrayAdapter(requireContext(), R.layout.spinner_item_white, levelArray) - adapterLang.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - adapterLevel.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - fragmentUserInformationBinding.spnLang.adapter = adapterLang - fragmentUserInformationBinding.spnLevel.adapter = adapterLevel - fragmentUserInformationBinding.spnLang.post { - val selectedView = fragmentUserInformationBinding.spnLang.selectedView as? TextView - selectedView?.setTextColor(ContextCompat.getColor(requireContext(), R.color.daynight_textColor)) - } - fragmentUserInformationBinding.spnLevel.post { - val selectedView = fragmentUserInformationBinding.spnLevel.selectedView as? TextView - selectedView?.setTextColor(ContextCompat.getColor(requireContext(), R.color.daynight_textColor)) - } + if (shouldHideElements == true) { + fragmentUserInformationBinding.btnAdditionalFields.visibility = View.VISIBLE + fragmentUserInformationBinding.btnAdditionalFields.setOnClickListener(this) + fragmentUserInformationBinding.ltAge.visibility = View.VISIBLE + fragmentUserInformationBinding.llNames.visibility = View.GONE + fragmentUserInformationBinding.llEmailLang.visibility = View.GONE + fragmentUserInformationBinding.llPhoneDob.visibility = View.GONE + fragmentUserInformationBinding.llLevel.visibility = View.GONE + } else { + val langArray = resources.getStringArray(R.array.language).toMutableList() + val levelArray = resources.getStringArray(R.array.level).toMutableList() + val adapterLang = ArrayAdapter(requireContext(), R.layout.spinner_item_white, langArray) + val adapterLevel = ArrayAdapter(requireContext(), R.layout.spinner_item_white, levelArray) + adapterLang.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + adapterLevel.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + fragmentUserInformationBinding.spnLang.adapter = adapterLang + fragmentUserInformationBinding.spnLevel.adapter = adapterLevel + fragmentUserInformationBinding.spnLang.post { + val selectedView = fragmentUserInformationBinding.spnLang.selectedView as? TextView + selectedView?.setTextColor(ContextCompat.getColor(requireContext(), R.color.daynight_textColor)) + } + fragmentUserInformationBinding.spnLevel.post { + val selectedView = fragmentUserInformationBinding.spnLevel.selectedView as? TextView + selectedView?.setTextColor(ContextCompat.getColor(requireContext(), R.color.daynight_textColor)) + } // fragmentUserInformationBinding.etEmail.setText(getString(R.string.message_placeholder, userModel?.email)) // fragmentUserInformationBinding.etFname.setText(getString(R.string.message_placeholder, userModel?.firstName)) // fragmentUserInformationBinding.etLname.setText(getString(R.string.message_placeholder, userModel?.lastName)) // fragmentUserInformationBinding.etPhone.setText(getString(R.string.message_placeholder, userModel?.phoneNumber)) // fragmentUserInformationBinding.txtDob.text = getString(R.string.message_placeholder, userModel?.dob) // dob = userModel?.dob - if (teamId != null) { - fragmentUserInformationBinding.btnCancel.visibility = View.GONE - } else { - fragmentUserInformationBinding.btnCancel.setOnClickListener(this) + if (teamId != null) { + fragmentUserInformationBinding.btnCancel.visibility = View.GONE + } else { + fragmentUserInformationBinding.btnCancel.setOnClickListener(this) + } + fragmentUserInformationBinding.txtDob.setOnClickListener(this) } fragmentUserInformationBinding.btnSubmit.setOnClickListener(this) - fragmentUserInformationBinding.txtDob.setOnClickListener(this) } override fun onClick(view: View) { @@ -85,61 +98,161 @@ class UserInformationFragment : BaseDialogFragment(), View.OnClickListener { } R.id.btn_submit -> submitForm() R.id.txt_dob -> showDatePickerDialog() + R.id.btnAdditionalFields -> toggleAdditionalFields() } } + private fun toggleAdditionalFields() { + val isAdditionalFieldsVisible = fragmentUserInformationBinding.llNames.visibility == View.VISIBLE + + fragmentUserInformationBinding.btnAdditionalFields.text = if (isAdditionalFieldsVisible) getString(R.string.show_additional_fields) else getString(R.string.hide_additional_fields) + fragmentUserInformationBinding.llNames.visibility = if (isAdditionalFieldsVisible) View.GONE else View.VISIBLE + fragmentUserInformationBinding.llEmailLang.visibility = if (isAdditionalFieldsVisible) View.GONE else View.VISIBLE + fragmentUserInformationBinding.llPhoneDob.visibility = if (isAdditionalFieldsVisible) View.GONE else View.VISIBLE + fragmentUserInformationBinding.llLevel.visibility = if (isAdditionalFieldsVisible) View.GONE else View.VISIBLE + fragmentUserInformationBinding.ltAge.visibility = if (isAdditionalFieldsVisible) View.VISIBLE else View.GONE + } + +// private fun submitForm() { +// var fname = "" +// var lname = "" +// var mName = "" +// var phone = "" +// var email = "" +// var gender = "" +// +// if (fragmentUserInformationBinding.llNames.visibility == View.VISIBLE) { +// fname = "${fragmentUserInformationBinding.etFname.text}".trim { it <= ' ' } +// lname = "${fragmentUserInformationBinding.etLname.text}".trim { it <= ' ' } +// mName = "${fragmentUserInformationBinding.etMname.text}".trim { it <= ' ' } +// } +// phone = "${fragmentUserInformationBinding.etPhone.text}".trim { it <= ' ' } +// email = "${fragmentUserInformationBinding.etEmail.text}".trim { it <= ' ' } +// +// val rbSelected = requireView().findViewById(fragmentUserInformationBinding.rbGender.checkedRadioButtonId) +// if (rbSelected != null) { +// gender = rbSelected.text.toString() +// } +// val level = "${fragmentUserInformationBinding.spnLevel.selectedItem}" +// val lang = "${fragmentUserInformationBinding.spnLang.selectedItem}" +// if (TextUtils.isEmpty(id)) { +// val userId = userModel?.id +// val finalGender = gender +// mRealm.executeTransactionAsync({ realm: Realm -> +// val model = realm.where(RealmUserModel::class.java).equalTo("id", userId).findFirst() +// if (model != null) { +// if (!TextUtils.isEmpty(fname)) model.firstName = fname +// if (!TextUtils.isEmpty(lname)) model.lastName = lname +// if (!TextUtils.isEmpty(email)) model.email = email +// if (!TextUtils.isEmpty(lang)) model.language = lang +// if (!TextUtils.isEmpty(phone)) model.phoneNumber = phone +// if (!TextUtils.isEmpty(dob)) model.birthPlace = dob +// if (!TextUtils.isEmpty(level)) model.level = level +// if (!TextUtils.isEmpty(finalGender)) model.gender = finalGender +// model.isUpdated = true +// } +// }, { +// Utilities.toast(MainApplication.context, getString(R.string.user_profile_updated)) +// if (isAdded) { +// dialog?.dismiss() +// } +// }) { +// Utilities.toast(MainApplication.context, getString(R.string.unable_to_update_user)) +// if (isAdded) { +// dialog?.dismiss() +// } +// } +// } else { +// val user = JsonObject() +// user.addProperty("name", "$fname $lname") +// user.addProperty("firstName", fname) +// user.addProperty("middleName", mName) +// user.addProperty("lastName", lname) +// user.addProperty("email", email) +// user.addProperty("language", lang) +// user.addProperty("phoneNumber", phone) +// user.addProperty("birthDate", dob) +// user.addProperty("gender", gender) +// user.addProperty("level", level) +// saveSubmission(user) +// } +// } + private fun submitForm() { - val fname = "${fragmentUserInformationBinding.etFname.text}".trim { it <= ' ' } - val lname = "${fragmentUserInformationBinding.etLname.text}".trim { it <= ' ' } - val mName = "${fragmentUserInformationBinding.etMname.text}".trim { it <= ' ' } - val phone = "${fragmentUserInformationBinding.etPhone.text}".trim { it <= ' ' } - val email = "${fragmentUserInformationBinding.etEmail.text}".trim { it <= ' ' } - var gender = "" - val rbSelected = requireView().findViewById(fragmentUserInformationBinding.rbGender.checkedRadioButtonId) - if (rbSelected != null) { - gender = rbSelected.text.toString() + var fname = "" + var lname = "" + var mName = "" + + if (fragmentUserInformationBinding.llNames.visibility == View.VISIBLE) { + fname = fragmentUserInformationBinding.etFname.text.toString().trim() + lname = fragmentUserInformationBinding.etLname.text.toString().trim() + mName = fragmentUserInformationBinding.etMname.text.toString().trim() + } + + val user = JsonObject() + + if (fname.isNotEmpty() || lname.isNotEmpty()) { + user.addProperty("name", "$fname $lname") } - val level = "${fragmentUserInformationBinding.spnLevel.selectedItem}" - val lang = "${fragmentUserInformationBinding.spnLang.selectedItem}" + if (fname.isNotEmpty()) user.addProperty("firstName", fname) + if (lname.isNotEmpty()) user.addProperty("lastName", lname) + if (mName.isNotEmpty()) user.addProperty("middleName", mName) + + if (fragmentUserInformationBinding.llPhoneDob.visibility == View.VISIBLE) { + val phone = fragmentUserInformationBinding.etPhone.text.toString().trim() + if (phone.isNotEmpty()) user.addProperty("phoneNumber", phone) + + if (!dob.isNullOrEmpty()) user.addProperty("birthDate", dob) + } + + if (fragmentUserInformationBinding.llEmailLang.visibility == View.VISIBLE) { + val email = fragmentUserInformationBinding.etEmail.text.toString().trim() + val lang = fragmentUserInformationBinding.spnLang.selectedItem.toString() + + if (email.isNotEmpty()) user.addProperty("email", email) + if (lang.isNotEmpty()) user.addProperty("language", lang) + } + + if (fragmentUserInformationBinding.llLevel.visibility == View.VISIBLE) { + val level = fragmentUserInformationBinding.spnLevel.selectedItem.toString() + if (level.isNotEmpty()) user.addProperty("level", level) + } + + if (fragmentUserInformationBinding.rbGender.visibility == View.VISIBLE) { + val rbSelected = requireView().findViewById(fragmentUserInformationBinding.rbGender.checkedRadioButtonId) + if (rbSelected != null) { + user.addProperty("gender", rbSelected.text.toString()) + } + } + if (TextUtils.isEmpty(id)) { val userId = userModel?.id - val finalGender = gender - mRealm.executeTransactionAsync({ realm: Realm -> + mRealm.executeTransactionAsync({ realm -> val model = realm.where(RealmUserModel::class.java).equalTo("id", userId).findFirst() if (model != null) { - if (!TextUtils.isEmpty(fname)) model.firstName = fname - if (!TextUtils.isEmpty(lname)) model.lastName = lname - if (!TextUtils.isEmpty(email)) model.email = email - if (!TextUtils.isEmpty(lang)) model.language = lang - if (!TextUtils.isEmpty(phone)) model.phoneNumber = phone - if (!TextUtils.isEmpty(dob)) model.birthPlace = dob - if (!TextUtils.isEmpty(level)) model.level = level - if (!TextUtils.isEmpty(finalGender)) model.gender = finalGender + user.keySet().forEach { key -> + when (key) { + "firstName" -> model.firstName = user.get(key).asString + "lastName" -> model.lastName = user.get(key).asString + "middleName" -> model.middleName = user.get(key).asString + "email" -> model.email = user.get(key).asString + "language" -> model.language = user.get(key).asString + "phoneNumber" -> model.phoneNumber = user.get(key).asString + "birthDate" -> model.birthPlace = user.get(key).asString + "level" -> model.level = user.get(key).asString + "gender" -> model.gender = user.get(key).asString + } + } model.isUpdated = true } }, { Utilities.toast(MainApplication.context, getString(R.string.user_profile_updated)) - if (isAdded) { - dialog?.dismiss() - } + if (isAdded) dialog?.dismiss() }) { Utilities.toast(MainApplication.context, getString(R.string.unable_to_update_user)) - if (isAdded) { - dialog?.dismiss() - } + if (isAdded) dialog?.dismiss() } } else { - val user = JsonObject() - user.addProperty("name", "$fname $lname") - user.addProperty("firstName", fname) - user.addProperty("middleName", mName) - user.addProperty("lastName", lname) - user.addProperty("email", email) - user.addProperty("language", lang) - user.addProperty("phoneNumber", phone) - user.addProperty("birthDate", dob) - user.addProperty("gender", gender) - user.addProperty("level", level) saveSubmission(user) } } @@ -188,16 +301,18 @@ class UserInformationFragment : BaseDialogFragment(), View.OnClickListener { get() = "sub_id" companion object { - fun getInstance(id: String?, teamId: String?): UserInformationFragment { + fun getInstance(id: String?, teamId: String?, shouldHideElements: Boolean): UserInformationFragment { + Log.d("UserInformationFragment", "shouldHideElements: $shouldHideElements") val f = UserInformationFragment() - setArgs(f, id, teamId) + setArgs(f, id, teamId, shouldHideElements) return f } - private fun setArgs(f: UserInformationFragment, id: String?, teamId: String?) { + private fun setArgs(f: UserInformationFragment, id: String?, teamId: String?, shouldHideElements: Boolean) { val b = Bundle() b.putString("sub_id", id) b.putString("teamId", teamId) + b.putBoolean("shouldHideElements", shouldHideElements) f.arguments = b } } diff --git a/app/src/main/res/layout/fragment_user_information.xml b/app/src/main/res/layout/fragment_user_information.xml index 129be3a68d..0121511bc1 100644 --- a/app/src/main/res/layout/fragment_user_information.xml +++ b/app/src/main/res/layout/fragment_user_information.xml @@ -3,8 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="@dimen/padding_normal" android:background="@color/secondary_bg" + android:padding="@dimen/padding_normal" tools:context=".ui.exam.UserInformationFragment"> + android:layout_height="wrap_content" + android:baselineAligned="false"> + android:textColor="@color/daynight_textColor" /> + android:textColor="@color/daynight_textColor" /> + android:textColor="@color/daynight_textColor" /> @@ -80,9 +83,9 @@ android:id="@+id/et_email" android:layout_width="match_parent" android:layout_height="wrap_content" + android:backgroundTint="@color/hint_color" android:hint="@string/email" - android:textColor="@color/daynight_textColor" - android:backgroundTint="@color/hint_color" /> + android:textColor="@color/daynight_textColor" /> + @@ -126,9 +131,9 @@ android:id="@+id/et_phone" android:layout_width="match_parent" android:layout_height="wrap_content" + android:backgroundTint="@color/hint_color" android:hint="@string/phone_number" - android:textColor="@color/daynight_textColor" - android:backgroundTint="@color/hint_color" /> + android:textColor="@color/daynight_textColor" /> @@ -160,6 +165,7 @@ android:textColor="@color/daynight_textColor" android:textSize="16sp" android:textStyle="bold" /> + + android:textColor="@color/daynight_textColor" /> + + android:textColor="@color/daynight_textColor" /> + + + + + + +