From 5b02f188f6ddfe122b0a99f5f5a9a2df09bc52a0 Mon Sep 17 00:00:00 2001 From: Kevin Gorham Date: Fri, 28 Aug 2020 03:58:35 -0400 Subject: [PATCH] Fix: Iterated on send flow from last sprint. Addressed most design feedback from this list https://github.com/zcash/zcash-android-wallet/issues/113\#issuecomment-676622252 --- .../z/ecc/android/ui/send/SendFragment.kt | 83 +++++++++++++------ .../selector_primary_button_activatable.xml | 8 ++ app/src/main/res/layout/fragment_send.xml | 26 ++++-- 3 files changed, 84 insertions(+), 33 deletions(-) create mode 100644 app/src/main/res/color/selector_primary_button_activatable.xml diff --git a/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt index 6d74911..6d96000 100644 --- a/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt +++ b/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt @@ -7,9 +7,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.widget.EditText -import androidx.biometric.BiometricConstants.* -import androidx.biometric.BiometricPrompt -import androidx.core.content.ContextCompat +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.Group import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.core.widget.ImageViewCompat @@ -28,7 +28,6 @@ import cash.z.ecc.android.ui.base.BaseFragment import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch -import java.util.concurrent.Executor class SendFragment : BaseFragment(), ClipboardManager.OnPrimaryClipChangedListener { @@ -137,7 +136,9 @@ class SendFragment : BaseFragment(), private fun onAddressChanged(address: String) { resumedScope.launch { - var type = when (sendViewModel.validateAddress(address)) { + val validation = sendViewModel.validateAddress(address) + binding.buttonSend.isActivated = !validation.isNotValid + var type = when (validation) { is AddressType.Transparent -> "This is a valid transparent address" to R.color.zcashGreen is AddressType.Shielded -> "This is a valid shielded address" to R.color.zcashGreen is AddressType.Invalid -> "This address appears to be invalid" to R.color.zcashRed @@ -178,7 +179,7 @@ class SendFragment : BaseFragment(), } else { resumedScope.launch { binding.textAddressError.text = errorMessage - delay(1500L) + delay(2500L) binding.textAddressError.text = "" } } @@ -234,28 +235,60 @@ class SendFragment : BaseFragment(), } private fun updateClipboardBanner(selected: Boolean = false, address: String? = loadAddressFromClipboard()) { - if (address == null) { - binding.groupClipboard.gone() - } else { - binding.groupClipboard.visible() - binding.clipboardAddress.text = address.toAbbreviatedAddress(16, 16) - binding.imageClipboardAddressSelected.goneIf(!selected) - ImageViewCompat.setImageTintList(binding.imageShield, ColorStateList.valueOf(if (selected) R.color.colorPrimary.toAppColor() else R.color.zcashWhite_12.toAppColor())) - binding.clipboardAddressLabel.setTextColor(if(selected) R.color.colorPrimary.toAppColor() else R.color.text_light.toAppColor()) - binding.clipboardAddress.setTextColor(if(selected) R.color.text_light.toAppColor() else R.color.text_light_dimmed.toAppColor()) + binding.apply { + updateAddressBanner( + groupClipboard, + clipboardAddress, + imageClipboardAddressSelected, + imageShield, + clipboardAddressLabel, + selected, + address + ) } +// binding.dividerClipboard.text = "On Clipboard" } - private fun updateLastUsedBanner(selected: Boolean = false, address: String? = loadLastUsedAddress()) { - if (address == null || address == loadAddressFromClipboard()) { - binding.groupLastUsed.gone() - } else { - binding.groupLastUsed.visible() - binding.lastUsedAddress.text = address.toAbbreviatedAddress(16, 16) - binding.imageLastUsedAddressSelected.goneIf(!selected) - ImageViewCompat.setImageTintList(binding.imageLastUsedShield, ColorStateList.valueOf(if (selected) R.color.colorPrimary.toAppColor() else R.color.zcashWhite_12.toAppColor())) - binding.lastUsedAddressLabel.setTextColor(if(selected) R.color.colorPrimary.toAppColor() else R.color.text_light.toAppColor()) - binding.lastUsedAddress.setTextColor(if(selected) R.color.text_light.toAppColor() else R.color.text_light_dimmed.toAppColor()) + private fun updateLastUsedBanner( + selected: Boolean = false, + address: String? = loadLastUsedAddress() + ) { + val isBoth = address == loadAddressFromClipboard() + binding.apply { + updateAddressBanner( + groupLastUsed, + lastUsedAddress, + imageLastUsedAddressSelected, + imageLastUsedShield, + lastUsedAddressLabel, + selected, + address.takeUnless { isBoth }) + } + binding.dividerClipboard.text = if (isBoth) "Last Used and On Clipboard" else "On Clipboard" + } + + private fun updateAddressBanner( + group: Group, + addressTextView: TextView, + checkIcon: ImageView, + shieldIcon: ImageView, + addressLabel: TextView, + selected: Boolean = false, + address: String? = loadLastUsedAddress() + ) { + resumedScope.launch { + if (address == null) { + group.gone() + } else { + val userAddress = sendViewModel.synchronizer.getAddress() + group.visible() + addressTextView.text = address.toAbbreviatedAddress(16, 16) + checkIcon.goneIf(!selected) + ImageViewCompat.setImageTintList(shieldIcon, ColorStateList.valueOf(if (selected) R.color.colorPrimary.toAppColor() else R.color.zcashWhite_12.toAppColor())) + addressLabel.setText(if (address == userAddress) R.string.send_banner_address_user else R.string.send_banner_address_unknown) + addressLabel.setTextColor(if(selected) R.color.colorPrimary.toAppColor() else R.color.text_light.toAppColor()) + addressTextView.setTextColor(if(selected) R.color.text_light.toAppColor() else R.color.text_light_dimmed.toAppColor()) + } } } diff --git a/app/src/main/res/color/selector_primary_button_activatable.xml b/app/src/main/res/color/selector_primary_button_activatable.xml new file mode 100644 index 0000000..602bc89 --- /dev/null +++ b/app/src/main/res/color/selector_primary_button_activatable.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_send.xml b/app/src/main/res/layout/fragment_send.xml index 0446c6f..af33cb1 100644 --- a/app/src/main/res/layout/fragment_send.xml +++ b/app/src/main/res/layout/fragment_send.xml @@ -131,6 +131,7 @@ android:layout_height="38dp" android:text="Send" android:textColor="@color/text_dark" + android:backgroundTint="@color/selector_primary_button_activatable" app:layout_constraintBottom_toBottomOf="@id/back_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.95" @@ -170,6 +171,16 @@ + + + + app:layout_constraintTop_toBottomOf="@id/spacer_lower_content" />