# 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](https://docs.verygoodsecurity.com/vault/vault#how-to-create-a-vault) and [Environment](https://docs.verygoodsecurity.com/vault/vault-management/going-live#sandbox-vs-live) type. You can find more information at the following [section](https://docs.verygoodsecurity.com/vault/developer-tools/vgs-collect/submit-data#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](https://docs.verygoodsecurity.com/vault/developer-tools/vgs-collect/submit-data#fields-state-tracking) or sending [additional information](https://docs.verygoodsecurity.com/vault/developer-tools/vgs-collect/submit-data#custom-data).

See also:

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