Connect Layer - Android Example

Introduction

Connect Layer provides a client-side functionality that allows you to authenticate user with their bank and retrieve accessCode required to obtain user’s permanent token.
This guide shows you how to integrate Dapi connect layer into an Android application via a WebView.

Basic Setup

Create a WebView in your layout.xml

<WebView
        android:id="@+id/wv_connect"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

And in your Activity or Fragment

private lateinit var wvConnect: WebView

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        wvConnect = findViewById(R.id.wv_connect)
        initializeConnect()
        ...
}

Configure the WebView for Connect

private fun initializeConnect() {
        val connectConfigurationLink = HashMap<String, String>()
        connectConfigurationLink["appKey"] = "APP_KEY"
        connectConfigurationLink["showLogo"] = "true"
        connectConfigurationLink["isExperimental"] = "false"
        connectConfigurationLink["baseUrl"] = "https://connect.dapi.co/v3/connection?"
        connectConfigurationLink["environment"] = "sandbox"
        
        val connectUrl = generateConnectInitializationUrl(connectConfigurationLink)
        val webSettings = wvConnect.settings
        webSettings.javaScriptEnabled = true
        webSettings.domStorageEnabled = true
        webSettings.cacheMode = WebSettings.LOAD_NO_CACHE
        WebView.setWebContentsDebuggingEnabled(true)
        setupConnectWebClient() 
        loadConnect(connectUrl)
}

Generate initialization URL

private fun generateConnectInitializationUrl(configurationOptions: HashMap<String, String>): Uri {
        val builder = Uri.parse(configurationOptions["baseUrl"])
                .buildUpon()
                .appendQueryParameter("isWebview", "true")
                .appendQueryParameter("isMobile", "true")
                .appendQueryParameter(
                        "countries",
                        "[\"AE\",\"EG\",\"JO\"]"
                )
        for (key in configurationOptions.keys) {
            if (key != "baseUrl") {
                builder.appendQueryParameter(key, configurationOptions[key])
            }
        }
        return builder.build()
}

To get data returned from connect, setup WebViewClient to listen to URL changes

private fun setupConnectWebClient() {
        wvConnect.webViewClient = object : WebViewClient() {
            override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) {
                super.doUpdateVisitedHistory(view, url, isReload)
                
                val parsedUri = Uri.parse(url)
                if (parsedUri.lastPathSegment == "success") {
              //Successful login data
                    val data = parseConnectUriData(parsedUri)
                    Log.i("DapiConnect", data.toString())
                }

                if (parsedUri.lastPathSegment == "error") {
              //Failed login attempt error details
                    val data = parseConnectUriData(parsedUri)
                    val bankID = data["bankID"]
                    val type = data["type"]
                    val msg = "${data["msg"]} for bankID $bankID"

                    Log.e("DapiConnect", "type: $type message: $msg")
                }
            }
        }
}

Parse data returned from Connect

private fun parseConnectUriData(uri: Uri): HashMap<String, String> {
        val data = HashMap<String, String>()
        val names = uri.queryParameterNames
        names.forEach {
            val params = uri.getQueryParameters(it)
            if (params.firstOrNull() != null) {
                if (
                        it == "fullName" ||
                        it == "miniLogoPng" ||
                        it == "halfLogoPng" ||
                        it == "fullLogoPng" ||
                        it == "msg"
                ) {
                    val param = URLDecoder.decode(params.first(), "UTF-8")
                    data[it] = param
                } else {
                    data[it] = params.first()
                }
            }
        }
        return data
}

Load Dapi Connect

private fun loadConnect(connectUrl: Uri) {
    wvConnect.loadUrl(connectUrl.toString())
}