Skip to content

Commit

Permalink
feat(kyc): AND-6659 KYC | Update screens to new design #2 (#4061)
Browse files Browse the repository at this point in the history
  • Loading branch information
aromano-bc committed Nov 9, 2022
1 parent bc7d7b6 commit 1c39c8b
Show file tree
Hide file tree
Showing 49 changed files with 2,190 additions and 2,175 deletions.
Expand Up @@ -12,6 +12,8 @@ sealed class KYCAnalyticsEvents(override val event: String, override val params:
object VerifyIdentityStart : KYCAnalyticsEvents("kyc_verify_id_start_button_click")
object VeriffInfoSubmitted : KYCAnalyticsEvents("kyc_veriff_info_submitted")
object VeriffInfoStarted : KYCAnalyticsEvents("kyc_veriff_started")
data class VeriffPreIDV(val result: String) :
KYCAnalyticsEvents("kyc_splash_request_gold_preIDV", mapOf("result" to result))
object Tier1Clicked : KYCAnalyticsEvents("kyc_unlock_silver_click")
object Tier2Clicked : KYCAnalyticsEvents("kyc_unlock_gold_click")
object PhoneNumberUpdateButtonClicked : KYCAnalyticsEvents("kyc_phone_update_button_click")
Expand Down
Expand Up @@ -137,7 +137,6 @@ import piuk.blockchain.android.ui.dataremediation.QuestionnaireModel
import piuk.blockchain.android.ui.dataremediation.QuestionnaireStateMachine
import piuk.blockchain.android.ui.home.ActionsSheetViewModel
import piuk.blockchain.android.ui.home.CredentialsWiper
import piuk.blockchain.android.ui.kyc.email.entry.EmailVerificationInteractor
import piuk.blockchain.android.ui.kyc.email.entry.EmailVerificationModel
import piuk.blockchain.android.ui.kyc.settings.KycStatusHelper
import piuk.blockchain.android.ui.launcher.DeepLinkPersistence
Expand Down Expand Up @@ -725,17 +724,8 @@ val applicationModule = module {
CryptographyManagerImpl()
}.bind(CryptographyManager::class)

factory {
viewModel {
EmailVerificationModel(
interactor = get(),
uiScheduler = AndroidSchedulers.mainThread(),
environmentConfig = get(),
remoteLogger = get()
)
}

factory {
EmailVerificationInteractor(
emailUpdater = get(),
getUserStore = get(),
)
Expand Down
Expand Up @@ -61,7 +61,7 @@ import piuk.blockchain.android.campaign.CampaignType
import piuk.blockchain.android.simplebuy.SimpleBuyActivity
import piuk.blockchain.android.ui.home.MainActivity
import piuk.blockchain.android.ui.kyc.email.entry.EmailEntryHost
import piuk.blockchain.android.ui.kyc.email.entry.KycEmailEntryFragment
import piuk.blockchain.android.ui.kyc.email.entry.KycEmailVerificationFragment
import piuk.blockchain.android.ui.kyc.navhost.KycNavHostActivity
import piuk.blockchain.android.ui.kyc.navhost.KycNavHostActivity.Companion.RESULT_KYC_FOR_SDD_COMPLETE
import timber.log.Timber
Expand Down Expand Up @@ -140,9 +140,9 @@ class CowboysFlowActivity : BlockchainActivity(), EmailEntryHost {
)
}

override fun onEmailEntryFragmentUpdated(shouldShowButton: Boolean, buttonAction: () -> Unit) {
override fun onEmailEntryFragmentUpdated(showSkipButton: Boolean, buttonAction: () -> Unit) {
emailSkipAction = buttonAction
shouldShowEmailSkipButton = shouldShowButton
shouldShowEmailSkipButton = showSkipButton
}

override fun onEmailVerified() {
Expand Down Expand Up @@ -308,7 +308,7 @@ fun EmailKycHost(
Column(
modifier = Modifier.fillMaxSize()
) {
val emailKycFragment = remember { KycEmailEntryFragment.newInstance(true) }
val emailKycFragment = remember { KycEmailVerificationFragment.newInstance(true) }

NavigationBar(
title = stringResource(R.string.security_check),
Expand All @@ -328,7 +328,7 @@ fun EmailKycHost(
EmbeddedFragment(
fragment = emailKycFragment,
fragmentManager = fragmentManager,
tag = KycEmailEntryFragment.javaClass.simpleName,
tag = KycEmailVerificationFragment.javaClass.simpleName,
modifier = Modifier.fillMaxSize()
)
}
Expand Down
@@ -0,0 +1,56 @@
package piuk.blockchain.android.ui.kyc.commonui

import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import com.blockchain.componentlib.basic.Image
import com.blockchain.componentlib.basic.ImageResource
import com.blockchain.componentlib.theme.AppTheme
import piuk.blockchain.android.R

@Composable
fun ColumnScope.UserIcon(
modifier: Modifier = Modifier,
@DrawableRes iconRes: Int,
@DrawableRes statusIconRes: Int? = null,
) {
ConstraintLayout(modifier) {
val (userIconRef, statusIconRef) = createRefs()

Image(
modifier = Modifier.constrainAs(userIconRef) {
top.linkTo(parent.top)
start.linkTo(parent.start)
end.linkTo(parent.end)
},
imageResource = ImageResource.LocalWithBackground(
id = iconRes,
iconTintColour = R.color.white,
backgroundColour = R.color.blue_600,
alpha = 1f,
size = AppTheme.dimensions.epicSpacing,
iconSize = AppTheme.dimensions.hugeSpacing,
shape = RoundedCornerShape(24.dp),
),
)

if (statusIconRes != null) {
Image(
modifier = Modifier.constrainAs(statusIconRef) {
top.linkTo(parent.top)
bottom.linkTo(parent.top)
start.linkTo(parent.end)
end.linkTo(parent.end)
},
imageResource = ImageResource.Local(
id = statusIconRes,
size = AppTheme.dimensions.hugeSpacing,
),
)
}
}
}
Expand Up @@ -3,60 +3,42 @@ package piuk.blockchain.android.ui.kyc.email.entry
import android.content.Context
import android.os.Bundle
import android.text.Editable
import android.text.TextUtils
import android.util.Patterns
import android.view.KeyEvent
import android.view.KeyEvent.KEYCODE_BACK
import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.DialogFragment
import com.blockchain.commonarch.presentation.mvi.MviBottomSheet
import com.blockchain.presentation.koin.scopedInject
import com.blockchain.commonarch.presentation.base.SlidingModalBottomDialog
import com.blockchain.componentlib.viewextensions.hideKeyboard
import com.google.android.material.textfield.TextInputEditText
import piuk.blockchain.android.R
import piuk.blockchain.android.databinding.ChangeEmailBottomSheetBinding
import piuk.blockchain.android.ui.customviews.KeyPreImeEditText
import piuk.blockchain.android.util.AfterTextChangedWatcher

class EditEmailAddressBottomSheet : MviBottomSheet<EmailVerificationModel,
EmailVerificationIntent,
EmailVerificationState,
ChangeEmailBottomSheetBinding>() {
class EditEmailAddressBottomSheet : SlidingModalBottomDialog<ChangeEmailBottomSheetBinding>() {

override val model: EmailVerificationModel by scopedInject()

override fun render(newState: EmailVerificationState) {
binding.save.isEnabled =
newState.canUpdateEmail &&
!newState.isLoading

if (newState.emailChanged) {
dismiss()
}
if (newState.emailInput == null && newState.email.address.isNotEmpty()) {
binding.editEmailInput.apply {
setText(newState.email.address)
setSelection(newState.email.address.length)
}
}
}

override fun initBinding(inflater: LayoutInflater, container: ViewGroup?): ChangeEmailBottomSheetBinding {
return ChangeEmailBottomSheetBinding.inflate(inflater, container, false)
interface Host : SlidingModalBottomDialog.Host {
fun updateEmail(email: String)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NORMAL, R.style.FloatingBottomSheet)
private val argCurrentEmail: String by lazy {
arguments?.getString(ARG_CURRENT_EMAIL)!!
}

private val imm: InputMethodManager by lazy {
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}
override val host: Host
get() = super.host as Host

override fun initControls(binding: ChangeEmailBottomSheetBinding) {
model.process(EmailVerificationIntent.FetchEmail)
showKeyboard()
with(binding) {
save.isEnabled = false
editEmailInput.setText(argCurrentEmail)
editEmailInput.setSelection(argCurrentEmail.length)

editEmailInput.keyImeChangeListener = object : KeyPreImeEditText.KeyImeChange {
override fun onKeyIme(keyCode: Int, event: KeyEvent?) {
if (keyCode == KEYCODE_BACK) {
Expand All @@ -66,16 +48,31 @@ class EditEmailAddressBottomSheet : MviBottomSheet<EmailVerificationModel,
}
editEmailInput.addTextChangedListener(object : AfterTextChangedWatcher() {
override fun afterTextChanged(textEntered: Editable?) {
model.process(EmailVerificationIntent.UpdateEmailInput(textEntered?.toString().orEmpty()))
save.isEnabled = canUpdateEmail(textEntered?.toString().orEmpty())
}
})

save.setOnClickListener {
model.process(EmailVerificationIntent.UpdateEmail)
host.updateEmail(editEmailInput.text?.toString().orEmpty())
dismiss()
requireActivity().hideKeyboard()
}
}
}

override fun initBinding(inflater: LayoutInflater, container: ViewGroup?): ChangeEmailBottomSheetBinding {
return ChangeEmailBottomSheetBinding.inflate(inflater, container, false)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NORMAL, R.style.FloatingBottomSheet)
}

private val imm: InputMethodManager by lazy {
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}

private fun showKeyboard() {
val inputView = binding.root.findViewById<TextInputEditText>(
R.id.edit_email_input
Expand All @@ -85,4 +82,22 @@ class EditEmailAddressBottomSheet : MviBottomSheet<EmailVerificationModel,
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
}

private fun canUpdateEmail(emailInput: String): Boolean =
emailInputIsValid(emailInput) && argCurrentEmail != emailInput

private fun emailInputIsValid(emailInput: String): Boolean =
!TextUtils.isEmpty(emailInput) && Patterns.EMAIL_ADDRESS.matcher(emailInput).matches()

companion object {
private const val ARG_CURRENT_EMAIL = "ARG_CURRENT_EMAIL"

fun newInstance(
currentEmail: String
): EditEmailAddressBottomSheet = EditEmailAddressBottomSheet().apply {
arguments = Bundle().apply {
putString(ARG_CURRENT_EMAIL, currentEmail)
}
}
}
}

This file was deleted.

This file was deleted.

0 comments on commit 1c39c8b

Please sign in to comment.