From 40e3686f8553243592055143b7d053e57560c268 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Wed, 24 Feb 2021 15:19:54 +0100 Subject: [PATCH] Add option to clear text fields when adding/editing persons/locations (DEV) #2454 Co-authored-by: Alex Paulescu <alex.paulescu@gmail.com> Co-authored-by: Ralf Gehrer <ralfgehrer@users.noreply.github.com> --- .../ContactDiaryAddLocationFragment.kt | 37 +++++++++--------- .../person/ContactDiaryAddPersonFragment.kt | 37 +++++++++--------- .../util/TextInputEditTextExtensions.kt | 12 ++++++ .../contact_diary_add_location_fragment.xml | 39 ++++++++++--------- .../contact_diary_add_person_fragment.xml | 35 +++++++++-------- 5 files changed, 90 insertions(+), 70 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TextInputEditTextExtensions.kt diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/location/ContactDiaryAddLocationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/location/ContactDiaryAddLocationFragment.kt index 078300ce3..b7540115e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/location/ContactDiaryAddLocationFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/location/ContactDiaryAddLocationFragment.kt @@ -12,6 +12,7 @@ import de.rki.coronawarnapp.contactdiary.util.hideKeyboard import de.rki.coronawarnapp.databinding.ContactDiaryAddLocationFragmentBinding import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.setTextOnTextInput import de.rki.coronawarnapp.util.ui.observe2 import de.rki.coronawarnapp.util.ui.popBackStack import de.rki.coronawarnapp.util.ui.viewBindingLazy @@ -40,52 +41,52 @@ class ContactDiaryAddLocationFragment : Fragment(R.layout.contact_diary_add_loca val location = navArgs.selectedLocation if (location != null) { binding.apply { - contactDiaryAddLocationNameInputEditText.setText(location.locationName) - contactDiaryAddLocationPhoneInputEditText.setText(location.phoneNumber) - contactDiaryAddLocationEmailInputEditText.setText(location.emailAddress) - contactDiaryAddLocationDeleteButton.visibility = View.VISIBLE - contactDiaryAddLocationDeleteButton.setOnClickListener { + locationNameInputEdit.setText(location.locationName) + locationPhoneInput.setTextOnTextInput(location.phoneNumber, endIconVisible = false) + locationEmailInput.setTextOnTextInput(location.emailAddress, endIconVisible = false) + locationDeleteButton.visibility = View.VISIBLE + locationDeleteButton.setOnClickListener { DialogHelper.showDialog(deleteLocationConfirmationDialog) } - contactDiaryAddLocationSaveButton.setOnClickListener { + locationSaveButton.setOnClickListener { it.hideKeyboard() viewModel.updateLocation( location, - phoneNumber = binding.contactDiaryAddLocationPhoneInputEditText.text.toString().trim(), - emailAddress = binding.contactDiaryAddLocationEmailInputEditText.text.toString().trim() + phoneNumber = binding.locationPhoneInput.text.toString().trim(), + emailAddress = binding.locationEmailInput.text.toString().trim() ) } } viewModel.locationChanged(location.locationName) } else { binding.apply { - contactDiaryAddLocationDeleteButton.visibility = View.GONE - contactDiaryAddLocationSaveButton.setOnClickListener { + locationDeleteButton.visibility = View.GONE + locationSaveButton.setOnClickListener { it.hideKeyboard() viewModel.addLocation( - phoneNumber = binding.contactDiaryAddLocationPhoneInputEditText.text.toString().trim(), - emailAddress = binding.contactDiaryAddLocationEmailInputEditText.text.toString().trim() + phoneNumber = binding.locationPhoneInput.text.toString().trim(), + emailAddress = binding.locationEmailInput.text.toString().trim() ) } } } binding.apply { - contactDiaryAddLocationNameInputEditText.focusAndShowKeyboard() + locationNameInputEdit.focusAndShowKeyboard() - contactDiaryAddLocationCloseButton.setOnClickListener { + locationCloseButton.setOnClickListener { it.hideKeyboard() viewModel.closePressed() } - contactDiaryAddLocationNameInputEditText.doAfterTextChanged { + locationNameInputEdit.doAfterTextChanged { viewModel.locationChanged(it.toString()) } - contactDiaryAddLocationEmailInputEditText.setOnEditorActionListener { _, actionId, _ -> + locationEmailInput.setOnEditorActionListener { _, actionId, _ -> return@setOnEditorActionListener when (actionId) { EditorInfo.IME_ACTION_DONE -> { if (viewModel.isValid.value == true) { - binding.contactDiaryAddLocationSaveButton.performClick() + binding.locationSaveButton.performClick() } false } @@ -99,7 +100,7 @@ class ContactDiaryAddLocationFragment : Fragment(R.layout.contact_diary_add_loca } viewModel.isValid.observe2(this) { - binding.contactDiaryAddLocationSaveButton.isEnabled = it + binding.locationSaveButton.isEnabled = it } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/person/ContactDiaryAddPersonFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/person/ContactDiaryAddPersonFragment.kt index 0a897ddac..ae8716f9f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/person/ContactDiaryAddPersonFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/person/ContactDiaryAddPersonFragment.kt @@ -12,6 +12,7 @@ import de.rki.coronawarnapp.contactdiary.util.hideKeyboard import de.rki.coronawarnapp.databinding.ContactDiaryAddPersonFragmentBinding import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.setTextOnTextInput import de.rki.coronawarnapp.util.ui.observe2 import de.rki.coronawarnapp.util.ui.popBackStack import de.rki.coronawarnapp.util.ui.viewBindingLazy @@ -42,50 +43,50 @@ class ContactDiaryAddPersonFragment : val person = navArgs.selectedPerson if (person != null) { binding.apply { - contactDiaryPersonNameEditText.setText(person.fullName) - contactDiaryPersonPhoneNumberEditText.setText(person.phoneNumber) - contactDiaryPersonEmailEditText.setText(person.emailAddress) - contactDiaryPersonDeleteButton.visibility = View.VISIBLE - contactDiaryPersonDeleteButton.setOnClickListener { + personNameInput.setText(person.fullName) + personPhoneNumberInput.setTextOnTextInput(person.phoneNumber, endIconVisible = false) + personEmailInput.setTextOnTextInput(person.emailAddress, endIconVisible = false) + personDeleteButton.visibility = View.VISIBLE + personDeleteButton.setOnClickListener { DialogHelper.showDialog(deletePersonConfirmationDialog) } - contactDiaryPersonSaveButton.setOnClickListener { + personSaveButton.setOnClickListener { it.hideKeyboard() viewModel.updatePerson( person, - phoneNumber = binding.contactDiaryPersonPhoneNumberEditText.text.toString().trim(), - emailAddress = binding.contactDiaryPersonEmailEditText.text.toString().trim() + phoneNumber = binding.personPhoneNumberInput.text.toString().trim(), + emailAddress = binding.personEmailInput.text.toString().trim() ) } } viewModel.nameChanged(person.fullName) } else { - binding.contactDiaryPersonDeleteButton.visibility = View.GONE - binding.contactDiaryPersonSaveButton.setOnClickListener { + binding.personDeleteButton.visibility = View.GONE + binding.personSaveButton.setOnClickListener { it.hideKeyboard() viewModel.addPerson( - phoneNumber = binding.contactDiaryPersonPhoneNumberEditText.text.toString().trim(), - emailAddress = binding.contactDiaryPersonEmailEditText.text.toString().trim() + phoneNumber = binding.personPhoneNumberInput.text.toString().trim(), + emailAddress = binding.personEmailInput.text.toString().trim() ) } } binding.apply { - contactDiaryPersonNameEditText.focusAndShowKeyboard() + personNameInput.focusAndShowKeyboard() - contactDiaryPersonCloseButton.setOnClickListener { + personCloseButton.setOnClickListener { it.hideKeyboard() viewModel.closePressed() } - contactDiaryPersonNameEditText.doAfterTextChanged { + personNameInput.doAfterTextChanged { viewModel.nameChanged(it.toString()) } - contactDiaryPersonEmailEditText.setOnEditorActionListener { _, actionId, _ -> + personEmailInput.setOnEditorActionListener { _, actionId, _ -> return@setOnEditorActionListener when (actionId) { IME_ACTION_DONE -> { if (viewModel.isNameValid.value == true) { - binding.contactDiaryPersonSaveButton.performClick() + binding.personSaveButton.performClick() } false } @@ -99,7 +100,7 @@ class ContactDiaryAddPersonFragment : } viewModel.isNameValid.observe2(this) { isValid -> - binding.contactDiaryPersonSaveButton.isEnabled = isValid + binding.personSaveButton.isEnabled = isValid } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TextInputEditTextExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TextInputEditTextExtensions.kt new file mode 100644 index 000000000..828d07c13 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TextInputEditTextExtensions.kt @@ -0,0 +1,12 @@ +package de.rki.coronawarnapp.util + +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textfield.TextInputLayout + +fun TextInputEditText.setTextOnTextInput( + text: String?, + endIconVisible: Boolean = true +) { + this.setText(text) + (parent?.parent as? TextInputLayout)?.isEndIconVisible = endIconVisible +} diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_add_location_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_add_location_fragment.xml index 6b605a281..1e1ec8dbe 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_add_location_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_add_location_fragment.xml @@ -9,7 +9,7 @@ android:layout_height="wrap_content"> <ImageView - android:id="@+id/contact_diary_add_location_close_button" + android:id="@+id/location_close_button" style="@style/buttonIcon" android:layout_width="@dimen/button_icon" android:layout_height="@dimen/button_icon" @@ -22,19 +22,19 @@ app:layout_constraintTop_toTopOf="parent" /> <TextView - android:id="@+id/contact_diary_add_location_title" + android:id="@+id/location_title" style="@style/headline6" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:text="@string/contact_diary_add_location_title" - app:layout_constraintBottom_toBottomOf="@id/contact_diary_add_location_close_button" - app:layout_constraintEnd_toStartOf="@id/contact_diary_add_location_delete_button" - app:layout_constraintStart_toEndOf="@id/contact_diary_add_location_close_button" - app:layout_constraintTop_toTopOf="@id/contact_diary_add_location_close_button" /> + app:layout_constraintBottom_toBottomOf="@id/location_close_button" + app:layout_constraintEnd_toStartOf="@id/location_delete_button" + app:layout_constraintStart_toEndOf="@id/location_close_button" + app:layout_constraintTop_toTopOf="@id/location_close_button" /> <ImageView - android:id="@+id/contact_diary_add_location_delete_button" + android:id="@+id/location_delete_button" style="@style/buttonIcon" android:layout_width="@dimen/button_icon" android:layout_height="@dimen/button_icon" @@ -47,19 +47,20 @@ app:layout_constraintTop_toTopOf="parent" /> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/contact_diary_add_location_name_input_layout" + android:id="@+id/location_name_input_layout" style="@style/TextInputLayoutTheme" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_small" android:hint="@string/contact_diary_add_location_text_input_hint" + app:endIconMode="clear_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/contact_diary_add_location_close_button"> + app:layout_constraintTop_toBottomOf="@id/location_close_button"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/contact_diary_add_location_name_input_edit_text" + android:id="@+id/location_name_input_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:imeOptions="actionNext" @@ -68,19 +69,20 @@ </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/contact_diary_add_location_phone_input_layout" + android:id="@+id/location_phone_input_layout" style="@style/TextInputLayoutTheme" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_tiny" android:hint="@string/contact_diary_add_text_input_phone_hint" + app:endIconMode="clear_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/contact_diary_add_location_name_input_layout"> + app:layout_constraintTop_toBottomOf="@id/location_name_input_layout"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/contact_diary_add_location_phone_input_edit_text" + android:id="@+id/location_phone_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:imeOptions="actionNext" @@ -89,19 +91,20 @@ </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/contact_diary_add_location_email_input_layout" + android:id="@+id/location_email_input_layout" style="@style/TextInputLayoutTheme" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_tiny" android:hint="@string/contact_diary_add_text_input_email_hint" + app:endIconMode="clear_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/contact_diary_add_location_phone_input_layout"> + app:layout_constraintTop_toBottomOf="@id/location_phone_input_layout"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/contact_diary_add_location_email_input_edit_text" + android:id="@+id/location_email_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:imeOptions="actionDone" @@ -110,7 +113,7 @@ </com.google.android.material.textfield.TextInputLayout> <Button - android:id="@+id/contact_diary_add_location_save_button" + android:id="@+id/location_save_button" style="@style/buttonPrimary" android:layout_width="0dp" android:layout_height="wrap_content" @@ -122,7 +125,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.166" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/contact_diary_add_location_email_input_layout" + app:layout_constraintTop_toBottomOf="@+id/location_email_input_layout" app:layout_constraintVertical_bias="1.0" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_add_person_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_add_person_fragment.xml index d6c328919..2163a98fb 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_add_person_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_add_person_fragment.xml @@ -9,7 +9,7 @@ android:layout_height="wrap_content"> <ImageView - android:id="@+id/contact_diary_person_close_button" + android:id="@+id/person_close_button" style="@style/buttonIcon" android:layout_width="@dimen/button_icon" android:layout_height="@dimen/button_icon" @@ -28,12 +28,12 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:text="@string/contact_diary_add_person_title" - app:layout_constraintBottom_toBottomOf="@+id/contact_diary_person_close_button" - app:layout_constraintStart_toEndOf="@+id/contact_diary_person_close_button" - app:layout_constraintTop_toTopOf="@+id/contact_diary_person_close_button" /> + app:layout_constraintBottom_toBottomOf="@+id/person_close_button" + app:layout_constraintStart_toEndOf="@+id/person_close_button" + app:layout_constraintTop_toTopOf="@+id/person_close_button" /> <ImageView - android:id="@+id/contact_diary_person_delete_button" + android:id="@+id/person_delete_button" style="@style/buttonIcon" android:layout_width="@dimen/button_icon" android:layout_height="@dimen/button_icon" @@ -46,19 +46,20 @@ app:layout_constraintTop_toTopOf="parent" /> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/contact_diary_person_name_input_layout" + android:id="@+id/person_name_input_layout" style="@style/TextInputLayoutTheme" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_small" android:hint="@string/contact_diary_add_person_text_input_name_hint" + app:endIconMode="clear_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/contact_diary_person_close_button"> + app:layout_constraintTop_toBottomOf="@+id/person_close_button"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/contact_diary_person_name_edit_text" + android:id="@+id/person_name_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:imeOptions="actionNext" @@ -67,19 +68,20 @@ </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/contact_diary_person_phone_input_layout" + android:id="@+id/person_phone_input_layout" style="@style/TextInputLayoutTheme" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_tiny" android:hint="@string/contact_diary_add_text_input_phone_hint" + app:endIconMode="clear_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/contact_diary_person_name_input_layout"> + app:layout_constraintTop_toBottomOf="@+id/person_name_input_layout"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/contact_diary_person_phone_number_edit_text" + android:id="@+id/person_phone_number_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:imeOptions="actionNext" @@ -88,7 +90,7 @@ </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/contact_diary_person_email_input_layout" + android:id="@+id/person_email_input_layout" style="@style/TextInputLayoutTheme" android:layout_width="0dp" android:layout_height="wrap_content" @@ -96,12 +98,13 @@ android:layout_marginTop="@dimen/spacing_tiny" android:layout_marginBottom="@dimen/spacing_small" android:hint="@string/contact_diary_add_text_input_email_hint" + app:endIconMode="clear_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/contact_diary_person_phone_input_layout"> + app:layout_constraintTop_toBottomOf="@+id/person_phone_input_layout"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/contact_diary_person_email_edit_text" + android:id="@+id/person_email_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:imeOptions="actionDone" @@ -110,7 +113,7 @@ </com.google.android.material.textfield.TextInputLayout> <Button - android:id="@+id/contact_diary_person_save_button" + android:id="@+id/person_save_button" style="@style/buttonPrimary" android:layout_width="0dp" android:layout_height="wrap_content" @@ -122,7 +125,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.333" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/contact_diary_person_email_input_layout" + app:layout_constraintTop_toBottomOf="@id/person_email_input_layout" app:layout_constraintVertical_bias="1.0" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> -- GitLab