Customising Customer Journey Flow – GBG IDscan Documentation

Customising Customer Journey Flow

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

Components

To display custom Fragments in CustomerJourney you must be aware of the following items:

  • CustomerJourneyNavigator – An interface that must be implemented. Alerts you to when a Fragment before a specified RequiredAction will be displayed.
  • CustomerJourneyFragment – Fragment that must be extended. Fragments extending this Fragment should be returned by the CustomJourneyNavigator.actionBefore() method
  • CustomerJourneyLoadingFragment – Fragment that must be extended. Fragments extending this Fragment should be returned by the CustomJourneyNavigator.onUploadStarted() method

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 Fragment by 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

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

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 CustomerJourney when 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

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

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

Previously disabling quality checks in CustomerJourney was not possible in this version we have added QualityCheckConfig that 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.Builder as shown in the example above.

Was this page helpful?