Customising Customer Journey Flow
Customer Journey
Section titled “Customer Journey”CustomerJourney has seen changes that will increase its customisability by introducing the ability to inject custom Fragments into the flow of the journey. Fragments can now be displayed before a RequiredAction and during an uploading task. This carries the intention of allowing custom information and loading screens to be displayed before each step of the journey and during each upload task. Making CustomerJourney become an option for customers that previously had to implement DocumentScanner and Livenessthemselves..
Components
Section titled “Components”To display custom Fragments in CustomerJourneyyou must be aware of the following items:
- CustomerJourneyNavigator – An interface that must be implemented. Alerts you to when a Fragmentbefore a specified RequiredActionwill be displayed.
- **CustomerJourneyFragment –**A Fragment that must be extended. Fragments extending this Fragmentshould be returned by the CustomJourneyNavigator.actionBefore() method
- **CustomerJourneyLoadingFragment –**A Fragment that must be extended. Fragments extending this Fragmentshould be returned by the CustomJourneyNavigator.onUploadStarted() method
Building a Custom Fragment
Section titled “Building a Custom Fragment”Building a custom Fragment for CustomerJourney is simple. The only differences from building a normal fragment are that:
- You must extend CustomerJourneyFragment
- You are responsible for notifying CustomerJourney when to remove the Fragmentby calling finish().
- You must override the TAG variable and set a unique String
Kotlin
class CustomerJourneyFragmentSample : CustomerJourneyFragment() {
//set a unique tag here override var TAG = "CustomerJourneyFragmentSample"
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_customer_journey_sample, container, false) }
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState)
//button that calls finish button.setOnClickListener { finish() } }}Java
public class CustomerJourneyFragmentSample extends CustomerJourneyFragment {
private Button button;
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_customer_journey_sample, container, false); view.findViewById(R.id.button); return view; }
@Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } });}
@NotNull @Override public String getTAG() { //set a unique tag here
return "CustomerJourneyFragmentSample"; }
@Override public void setTAG(@NotNull String TAG) { //no operation }}Building a Custom Loading Fragment
Section titled “Building a Custom Loading Fragment”To build a custom Loading Fragment for CustomerJourney you must be aware of the following:
- You must extend CustomerJourneyLoadingFragment
- You are notified when the Fragment is ready to be removed. You can either let the fragment be removed automatically or decide when to remove it yourself and call finish().
- You must override the TAG variable and set a unique String
- You are responsible for handling errors by either retrying the failed action or cancelling the journey. This can be done by either calling **retry()**or cancel()
Kotlin
class CustomerJourneyLoadingFragmentSample : CustomerJourneyLoadingFragment() {
override var TAG = "CustomerJourneyLoadingFragmentSample"
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_customer_journey_loading_sample, container, false) }
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) textViewCustomerJourneyLoadingFragmentSampleTitle.setText(R.string.customer_journey_sample_uploading_fragment) buttonCustomerJourneyFragmentSampleRetry.setOnClickListener { retry(); setButtonVisibility(View.GONE) } // retry the previous action buttonCustomerJourneyFragmentSampleCancel.setOnClickListener { cancel(); setButtonVisibility(View.GONE) } // cancel the journey }
override fun onError(code: Int, message: String) { //display the error message to the user and make retry and cancel buttons visible setButtonVisibility(View.VISIBLE) progressBarCustomerJourneyLoadingFragmentSample?.visibility = View.GONE textViewCustomerJourneyLoadingFragmentSampleTitle?.text = "Error Code: $codenMessage: $message" }
override fun onUploadFinished(): Boolean { super.onUploadFinished() //... anything you want to do after the upload has finished return false // if you do not want the fragment to be removed immediately after this method then return true. finish() must be called to remove the fragment }
private fun setButtonVisibility(visibility : Int) { buttonCustomerJourneyFragmentSampleRetry?.visibility = visibility buttonCustomerJourneyFragmentSampleCancel?.visibility = visibility }}Building the Navigator
Section titled “Building the Navigator”To build a navigator you must create a class then implement the CustomerJourneyNavigator interface. This will add the following methods to your class:
- actionBefore(action : Action, responseUpload: ResponseUpload?) – This method is called by CustomerJourney and returns a****CustomerJourneyFragment**.** It passes the next RequiredAction as an argument along with a response from the backend if available. This will tell you which fragment to return so it can be displayed.
- onUploadStarted() – This method is called by CustomerJourneywhen an uploading task has started and returns****CustomerJourneyLoadingFragment.You can return your custom loading Fragment here.
kotlin
class Navigator : CustomerJourneyNavigator {
override fun actionBefore(action: Action): CustomerJourneyFragment? { return when (action) { //return the correct fragment depending on the action is FrontSide -> CustomerJourneyFragmentSample("BEFORE FRONT SIDE") is BackSide -> ... is Selfie -> ... is Liveness -> ... is AddressDocument -> ... is NfcScan -> ... else -> return null // CustomerJourney continues as normal when null is returned } }
override fun onUploadStarted(): CustomerJourneyLoadingFragment? { return CustomerJourneyLoadingFragmentSample() //return loading fragment... CustomerJourney continues as normal when null is returned }}class Navigator : CustomerJourneyNavigator {
override fun actionBefore(action: Action, responseUpload: ResponseUpload?): CustomerJourneyFragment? { return when (action) { //return the correct fragment depending on the action is FrontSide -> CustomerJourneyFragmentSample("BEFORE FRONT SIDE") is BackSide -> ... is Selfie -> ... is Liveness -> ... is AddressDocument -> ... is PassiveLiveness -> ... is NfcScan -> ... else -> return null // CustomerJourney continues as normal when null is returned } }
override fun onUploadStarted(action: Action): CustomerJourneyLoadingFragment? { return CustomerJourneyLoadingFragmentSample() //return loading fragment... CustomerJourney continues as normal when null is returned }}class Navigator : CustomerJourneyNavigator {
override fun actionBefore(action: Action): CustomerJourneyFragment? { return when (action) { //return the correct fragment depending on the action is FrontSide -> CustomerJourneyFragmentSample("BEFORE FRONT SIDE") is BackSide -> ... is Selfie -> ... is Liveness -> ... is AddressDocument -> ... is NfcScan -> ... else -> return null // CustomerJourney continues as normal when null is returned } }
override fun onUploadStarted(): CustomerJourneyLoadingFragment? { return CustomerJourneyLoadingFragmentSample() //return loading fragment... CustomerJourney continues as normal when null is returned }}Starting CustomerJourney
Section titled “Starting CustomerJourney”After all the individual components have been built. The CustomerJourneyNavigator can be passed into the CustomerJourneyActivity.
Kotlin
CustomerJourneyActivity.startActivity(this, config, Navigator())Java
CustomerJourneyActivity.startActivity(this,config,new Navigator())
Customer Journey Config
Section titled “Customer Journey Config”Creating a CustomerJourneyConfig
Kotlin
val config = CustomerJourneyConfig.Builder(baseUrl, Credentials(username, password)).setCertificates(emptyList()) .setJourneyDefinitionId(journeyDefinitionGUID) .setCropConfig(cropType) .setQualityCheckConfig(qualityCheckConfig) .build()Java
CustomerJourney.Builder config = new CustomerJourneyConfig.Builder(baseUrl, Credentials(username, password)).setCertificates(emptyList()) .setJourneyDefinitionId(journeyDefinitionGUID) .setCropConfig(cropType) .setQualityCheckConfig(qualityCheckConfig) .build()Quality Checks
Section titled “Quality Checks”Previously disabling quality checks in CustomerJourney was not possible in this version we have added QualityCheckConfigthat can be set on the CustomerJourneyConfig.Builder.
Kotlin
val qualityCheckConfig = QualityCheckConfig(false,false,false,false)Java
QualityCheckConfig qualityCheckConfig = new QualityCheckConfig(false,false,false,false);The qualityCheckConfig can then be set in the CustomerJourneyConfig.Builderas shown in the example above.