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