Skip to content
GBG Documents & Biometrics Documentation

Customising Customer Journey Flow

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..

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 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
}
}

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
}
}

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
}
}

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())

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()

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.