Quiltt Logo

Android SDK

The Quiltt Android SDK provides Components for seamless integration of the Quiltt Connector into your Android app.

Documentation

For full documentation, additional examples and the source code, see the Quiltt Android SDK on Github.

Link to this section#Install

Link to this section#Maven Central

android {
    defaultConfig {
        minSdk = 26 // or greater
    }
}

dependencies {
    ...
    implementation("app.quiltt:connector:<INSERT_LATEST_VERSION>")
}

Link to this section#Setting up OAuth

For production Environments, you must pass a https:// URL to oauthRedirectUrl. This URL must be a valid deep link to launch your app.

To set up a deep link to your app, please see the Android App Links guide.

If you are bringing your own Plaid credentials, you must register the Quiltt callback URL as an allowed redirect URI in the Plaid Dashboard. See the Plaid OAuth guide for more information.
https://*.callback.quiltt.io

Link to this section#Usage

Link to this section#Jetpack Compose

package app.quiltt.app_jetpack_compose

import android.app.Activity
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.viewinterop.AndroidView
import app.quiltt.connector.QuilttConnector
import app.quiltt.connector.QuilttConnectorConnectConfiguration

class QuilttConnectorActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val config = QuilttConnectorConnectConfiguration(
            connectorId = "<CONNECTOR_ID>",
            institution = "<OPTIONAL_SEARCH_TERM_TO_PREFILL_INSTITUTION>",
            oauthRedirectUrl = "<YOUR_HTTP_APP_LINK")
        val token = "<ACCESS_TOKEN>"
        setContent {
            QuilttConnectorContent(config = config, token = token)
        }
    }
}

@Composable
fun QuilttConnectorContent(config: QuilttConnectorConnectConfiguration, token: String? = null) {
    val context = LocalContext.current
    val quilttConnector = QuilttConnector(context)
    if (token != null) {
        quilttConnector.authenticate(token)
    }
    val connectorWebView = quilttConnector.connect(
        config = config,
        onEvent = { eventType, metadata ->
            println("Event: $eventType")
            println("Metadata: $metadata")
        },
        onExit = { eventType, metadata ->
            println("Event: $eventType")
            println("Metadata: $metadata")
        },
        onExitSuccess = { metadata ->
            println("Exit success!")
            println("Metadata: $metadata")
            Toast.makeText(context, metadata.connectionId, Toast.LENGTH_LONG).show()
            if (context is Activity) {
                context.finish()
            }
        },
        onExitAbort = { metadata ->
            println("Exit abort!")
            println("Metadata: $metadata")
            if (context is Activity) {
                context.finish()
            }
        },
        onExitError = { metadata ->
            println("Exit error!")
            println("Metadata: $metadata")
            if (context is Activity) {
                context.finish()
            }
        })
    AndroidView(factory = { connectorWebView } )
}

Link to this section#XML Layout

package app.quiltt.example

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.constraintlayout.widget.ConstraintLayout
import app.quiltt.connector.QuilttConnector
import app.quiltt.connector.QuilttConnectorConnectConfiguration
import app.quiltt.connector.QuilttConnectorWebView

class QuilttConnectorActivity : AppCompatActivity() {
    private lateinit var webView: QuilttConnectorWebView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_quiltt_connector)

        val connectorLayout = findViewById<ConstraintLayout>(R.id.connector_layout)
        val quilttConnector = QuilttConnector(this)
        quilttConnector.authenticate("<SESSION_TOKEN>")
        val quilttConnectorConfiguration = QuilttConnectorConnectConfiguration(
            connectorId = "<CONNECTOR_ID>",
            institution = "<OPTIONAL_SEARCH_TERM_TO_PREFILL_INSTITUTION>",
            oauthRedirectUrl = "<YOUR_HTTPS_APP_LINK>")

        webView = quilttConnector.connect(
            config = quilttConnectorConfiguration,
            onEvent = { eventType, metadata ->
                println("Event: $eventType")
                println("Metadata: $metadata")
            },
            onExit = { eventType, metadata ->
                println("Event: $eventType")
                println("Metadata: $metadata")
            },
            onExitSuccess = { metadata ->
                println("Exit success!")
                println("Metadata: $metadata")
                Toast.makeText(this, metadata.connectionId, Toast.LENGTH_LONG).show()
                finish()
            },
            onExitAbort = { metadata ->
                println("Exit abort!")
                println("Metadata: $metadata")
                finish()
            },
            onExitError = { metadata ->
                println("Exit error!")
                println("Metadata: $metadata")
                finish()
            })

        connectorLayout.addView(webView)
    }

    override fun onDestroy() {
        webView.destroy()
        super.onDestroy()
    }
}