# How to Integrate

## Quickstart from Dashboard

You should have your organization registered at the [VGS Dashboard](https://dashboard.verygoodsecurity.com/dashboard/). Sandbox vault will be pre-created for you. You should use your to start collecting data. Follow integration guide below.

## Integrate VGS Collect SDK into Your Android Project

To use the SDK in your project you just need to add the following line of dependency in your module [build.gradle](https://developer.android.com/studio/build/dependencies) file and then rebuild project.

> Follow our latest [releases](https://github.com/verygoodsecurity/vgs-collect-android/releases) .

```gradle
dependencies {
    //...
    implementation 'com.verygoodsecurity:vgscollect:<latest-version>'
    //...
}

```

### Include additional configurations

In case you have **minifyEnabled** enabled don't forget to add next line to your project R8 configuration.

```r8
//...
-keep public class com.google.android.material**  { *; }
//...

```

## Configure Your App

To initialize VGSCollect you have to set your [vault id](/vault/vault.md#how-to-create-a-vault) and [Environment](/vault/developer-tools/vault-management/going-live.md#sandbox-vs-live) type. You can find more information at the following [section](/vault/developer-tools/vgs-collect/android-sdk/submit-data.md#start-session).

```kotlin
import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
    }
    override fun onDestroy() {
        super.onDestroy()
    }
}

```

```java
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;\n
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
        vgsForm = new VGSCollect( this, "<VAULT_ID>", Environment.<SANDBOX>);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

```

## Configuring UI Elements

Add input field to `R.layout.activity_main` layout file:

> You must set up `fieldName` to the `VGSCardNumberEditText` in other way input field will be ignored by VGSCollect.

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <com.verygoodsecurity.vgscollect.widget.VGSTextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:hintEnabled="true"
        app:hint="Card number"
        app:boxCornerRadius="4dp"
        app:boxBackgroundModes="outline">

        <com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
            android:id="@+id/cardNumberField"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:fieldName="card_number"
            app:numberDivider="-"
            app:cardBrandIconGravity="end"/>

    </com.verygoodsecurity.vgscollect.widget.VGSTextInputLayout>

    <Button
        android:id="@+id/submitBtn"
        android:text="Submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
```

## Collecting Sensitive Data on Android

Once you have added the input field to your layout , find the object, attach it to `VGSCollect` for the data to be sent securely:

```kotlin
import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
        val submitBtn = findViewById<Button>(R.id.submitBtn)
        val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
        vgsForm.bindView(cardNumberField)
    }\n
    override fun onDestroy() {
        super.onDestroy()
    }
}
```

```java
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText;
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vgsForm = new VGSCollect( this, "<VAULT_ID>", Environment.<SANDBOX>);
        Button submitBtn = findViewById(R.id.submitBtn);
        VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
        vgsForm.bindView(myTextView);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}
```

## Submit Information

Call `asyncSubmit` to execute and send data on VGS Server

> Do not use `submit` on the UI thread as this will crash.

```kotlin
import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
        val submitBtn = findViewById<Button>(R.id.submitBtn)
        submitBtn?.setOnClickListener {
            submitData()
        }
        val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
        vgsForm.bindView(cardNumberField)
    }
    private fun submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST)
    }
    override fun onDestroy() {
        super.onDestroy()
    }
}
```

```java
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText;
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>);
       Button submitBtn = findViewById(R.id.submitBtn);
       submitBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               submitData();
           }
       });
       VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
       vgsForm.bindView(myTextView);
    }
    private void submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}
```

## End Session

Finish work with **VGSCollect** by calling onDestroy inside android `onDestroy` callback:

```kotlin
import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
        val submitBtn = findViewById<Button>(R.id.submitBtn)
        submitBtn?.setOnClickListener {
            submitData()
        }
        val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
        vgsForm.bindView(cardNumberField)
    }
    private fun submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST)
    }
    override fun onDestroy() {
        vgsForm.onDestroy()
        super.onDestroy()
    }
}
```

```java
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText;\n
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);\n
       vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>);\n
       Button submitBtn = findViewById(R.id.submitBtn);
       submitBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               submitData();
           }
       });
       VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
       vgsForm.bindView(myTextView);
    }
    private void submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST);
    }
    @Override
    protected void onDestroy() {
        vgsForm.onDestroy();
        super.onDestroy();
    }
}
```

### Handling Responses

To read response or track different errors you need to implement `VgsCollectResponseListener`:

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)\n
    vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)\n
    val submitBtn = findViewById<Button>(R.id.submitBtn)
    submitBtn?.setOnClickListener {
        submitData()
    }
    val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
    vgsForm.bindView(cardNumberField)
    vgsForm.addOnResponseListeners(object : VgsCollectResponseListener {
        override fun onResponse(response: VGSResponse?) {
            val code = response.code
            val body = response.body
        }
    })
}
```

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   vgsForm = new VGSCollect( this, "<VAULT_ID>", Environment.<SANDBOX>);
   Button submitBtn = findViewById(R.id.submitBtn);
   submitBtn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           submitData();
       }
   });
   VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
   vgsForm.bindView(myTextView);
   vgsForm.addOnResponseListeners(new VgsCollectResponseListener() {
       @Override
       public void onResponse(VGSResponse response) {
           int code = response.getCode();
           String body = response.getBody();
       }
   });
}
```

## More Information

In addition, there is some documentation you might want to read next about [tracking changes](/vault/developer-tools/vgs-collect/android-sdk/submit-data.md#fields-state-tracking) or sending [additional information](/vault/developer-tools/vgs-collect/android-sdk/submit-data.md#custom-data).

See also:

* [UI Components](/vault/developer-tools/vgs-collect/android-sdk/ui-components.md)
* [Observing States and Submitting Data](/vault/developer-tools/vgs-collect/android-sdk/submit-data.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.verygoodsecurity.com/vault/developer-tools/vgs-collect/android-sdk/integration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
