Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

teams: smoother survey submissions (fixes #5348) #5349

Merged
merged 6 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
applicationId "org.ole.planet.myplanet"
minSdkVersion 26
targetSdkVersion 34
versionCode 2332
versionName "0.23.32"
versionCode 2333
versionName "0.23.33"
ndkVersion '21.3.6528147'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ open class BaseDashboardFragment : BaseDashboardFragmentPlugin(), NotificationCa
v.findViewById<LinearLayout>(R.id.ll_prompt).visibility = View.VISIBLE
v.findViewById<LinearLayout>(R.id.ll_prompt).setOnClickListener {
if (!childFragmentManager.isStateSaved) {
UserInformationFragment.getInstance("", "").show(childFragmentManager, "")
UserInformationFragment.getInstance("", "", false).show(childFragmentManager, "")
}
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,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)
Expand All @@ -41,41 +42,48 @@ 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)
fragmentUserInformationBinding.txtDob.setOnClickListener(this)
}

fragmentUserInformationBinding.btnCancel.setOnClickListener(this)
fragmentUserInformationBinding.btnSubmit.setOnClickListener(this)
fragmentUserInformationBinding.txtDob.setOnClickListener(this)
}

override fun onClick(view: View) {
Expand All @@ -85,61 +93,107 @@ 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() {
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<RadioButton>(fragmentUserInformationBinding.rbGender.checkedRadioButtonId)
if (rbSelected != null) {
gender = rbSelected.text.toString()
var fname = ""
var lname = ""
var mName = ""
var age = ""

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 (fragmentUserInformationBinding.ltAge.visibility == View.VISIBLE) {
age = fragmentUserInformationBinding.etAge.text.toString().trim()

if (age.isNotEmpty()) {
user.addProperty("age", age)
}
}


if (fname.isNotEmpty() || lname.isNotEmpty()) {
user.addProperty("name", "$fname $lname")
}
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)
}
val level = "${fragmentUserInformationBinding.spnLevel.selectedItem}"
val lang = "${fragmentUserInformationBinding.spnLang.selectedItem}"

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<RadioButton>(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
"age" -> model.age = 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)
}
}
Expand Down Expand Up @@ -188,16 +242,17 @@ 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 {
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
}
}
Expand Down
Loading