> For the complete documentation index, see [llms.txt](https://docs.caf.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.caf.io/caf-sdk/caf-sdk-pt-br/android/standalone-modules/document-detector/builder/customization.md).

# Personalização

## **Criação de layout personalizado** <a href="#id-1cu2xc1ffove" id="id-1cu2xc1ffove"></a>

Para criar um novo layout, recomendamos que você use o [modelos padrão](#default-templates) dos SDKs e faça as alterações desejadas.

### **Passo a passo** <a href="#id-37x46ment93o" id="id-37x46ment93o"></a>

1. Declare a dependência de **`CameraView`** no arquivo gradle no nível do app.

```java
// Biblioteca principal do CameraX usando a implementação camera2
implementation "androidx.camera:camera-view:1.3.4"
```

2\. Crie um arquivo de layout no diretório de layout do seu projeto usando o modelo CAF.

3\. Crie suas views e parametrize a visibilidade e os métodos de chamada do ViewModel de cada SDK correspondente de acordo com as tabelas a seguir. Exemplo:

```xml
<layout>
...
    <androidx.camera.view.PreviewView
        android:id="@id/cameraImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="@{viewModel.cameraVisibility ? View.VISIBLE : View.GONE}"
    />
    ...
</layout>
```

## **Variáveis e métodos usados no layout** <a href="#n3rexr1oary0" id="n3rexr1oary0"></a>

Todos os métodos e variáveis descritos abaixo são acessados pela classe SDKViewModel.

### Métodos

<table><thead><tr><th width="194">Método</th><th width="257">Descrição</th><th width="86">Retorno</th><th>SDK</th></tr></thead><tbody><tr><td><strong><code>takePhoto()</code></strong></td><td>Responsável por iniciar a captura de imagem no modo MANUAL</td><td>Void</td><td>DocumentDetector, PassiveFaceLiveness</td></tr><tr><td><strong><code>close()</code></strong></td><td>Responsável por fechar o SDK.</td><td>Void</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>switchCamera()</code></strong></td><td>Responsável por inverter a câmera.</td><td>Void</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr></tbody></table>

### **Variáveis de estado** <a href="#id-7v50gn2gvmig" id="id-7v50gn2gvmig"></a>

O layout usado no SDK é composto por várias variáveis de estado; essas variáveis são responsáveis por identificar o estado em que o SDK se encontra a cada momento de sua execução:

<table><thead><tr><th width="213">Variável</th><th width="223">Descrição</th><th width="114">Tipo</th><th>SDK</th></tr></thead><tbody><tr><td><strong><code>loadingStatus</code></strong></td><td>Indica o estado de "carregando"</td><td>Booleano</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>readyToCaptureStatus</code></strong></td><td>Indica que o SDK está pronto para capturar, após realizar todas as validações de sensores, enquadramento, rosto etc.</td><td>Booleano</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>stepDoneSuccessfullyStatus</code></strong></td><td>Indica que a etapa de captura terminou com sucesso</td><td>Booleano</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>validationFailureStatus</code></strong></td><td>Indica se há alguma falha nas verificações de sensor, qualidade, enquadramento, distância do rosto etc.</td><td>Booleano</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>validationFailureId</code></strong></td><td>Indica que tipo de erro ocorreu. Veja a tabela abaixo</td><td>ValidationFailure</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>captureModeStatus</code></strong></td><td>Indica o modo de captura ativado. Pode variar entre AUTOMATIC e MANUAL</td><td>CaptureMode</td><td>DocumentDetector, PassiveFaceLiveness</td></tr><tr><td><strong><code>maskStatus</code></strong></td><td>Indica o status da máscara. Pode variar de NORMAL, SUCCESS a ERROR</td><td>Mask</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>maskLayout</code></strong></td><td>Responsável por retornar o ID do recurso Drawable usado para definir a máscara.</td><td>Inteiro</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>previousStepName</code></strong></td><td>Nome da etapa anterior que foi executada. Caso contrário, o valor será nulo. Exemplo: verso do documento de identidade.</td><td>String</td><td>DocumentDetector <code>v7.x ou inferior</code></td></tr></tbody></table>

### Variáveis de visibilidade <a href="#id-2i9eh4sq969z" id="id-2i9eh4sq969z"></a>

<table><thead><tr><th width="210">Variável</th><th width="231">Descrição</th><th width="112">Tipo</th><th>SDK</th></tr></thead><tbody><tr><td><strong><code>popUpVisibility</code></strong></td><td>Indica a visibilidade do pop-up de inicialização da etapa</td><td>Booleano</td><td>DocumentDetector</td></tr><tr><td><strong><code>manualCaptureButtonVisibility</code></strong></td><td>Indica a visibilidade do botão de captura manual</td><td>Booleano</td><td>DocumentDetector, PassiveFaceLiveness</td></tr><tr><td><strong><code>switchCameraButtonVisibility</code></strong></td><td>Indica a visibilidade do botão de inverter a câmera</td><td>Booleano</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>statusVisibility</code></strong></td><td>Responsável pela visibilidade da mensagem de status do SDK.</td><td>Booleano</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>statusMessage</code></strong></td><td>Retorna a mensagem de status. Personalize com MessageSettings</td><td>String</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>feedbackStatusMessage</code></strong></td><td>Retorna a mensagem de status. Personalize com MessageSettings</td><td>String</td><td>DocumentDetector</td></tr><tr><td><strong><code>cameraVisibility</code></strong></td><td>Responsável pela visibilidade da câmera.</td><td>Booleano</td><td>DocumentDetector, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>maskVisibility</code></strong></td><td>Indica a visibilidade da máscara.</td><td>Booleano</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>switchButtonVisibility</code></strong></td><td><p>Responsável pela visibilidade do botão de girar a câmera.</p><p>Esta variável foi descontinuada; recomendamos usar a variável switchCameraButtonVisibility.</p></td><td>Booleano</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>serverRequesting</code></strong></td><td><p>Responsável pela visibilidade do carregamento exibido pelo SDK.</p><p>Esta variável foi descontinuada; recomendamos usar a variável loadingStatus.</p></td><td>Booleano</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness, FaceAuthenticator</td></tr><tr><td><strong><code>buttonVisibility</code></strong></td><td><p>Define a visibilidade do botão de captura manual.</p><p>Esta variável foi descontinuada; use manualCaptureButtonVisibility.</p></td><td>Booleano</td><td>DocumentDetector <code>v7.x ou inferior</code>, PassiveFaceLiveness</td></tr></tbody></table>

### **ValidationFailure** <a href="#j7cgfhax2d6p" id="j7cgfhax2d6p"></a>

Cada SDK contém vários erros de validação que podem ocorrer durante a execução. A maioria deles gera o estado de "máscara de erro" e impede que a captura seja realizada:

| Erro                                | Descrição                                                           | SDK                                                      |
| ----------------------------------- | ------------------------------------------------------------------- | -------------------------------------------------------- |
| **`SENSOR_LUMINOSITY_FAILURE`**     | Sensor de luminosidade. O ambiente está muito escuro                | DocumentDetector, PassiveFaceLiveness                    |
| **`SENSOR_ORIENTATION_FAILURE`**    | Sensor de orientação. O dispositivo não está na posição correta     | DocumentDetector, PassiveFaceLiveness                    |
| **`SENSOR_STABILITY_FAILURE`**      | Sensor de estabilidade. O dispositivo está em movimento             | DocumentDetector, PassiveFaceLiveness, FaceAuthenticator |
| **`FRAMING_FAILURE`**               | Enquadramento de documento ou rosto                                 | DocumentDetector, PassiveFaceLiveness, FaceAuthenticator |
| **`EYES_CLOSED_FAILURE`**           | Foi identificado um rosto com os olhos fechados                     | PassiveFaceLiveness, FaceAuthenticator                   |
| **`FACE_NOT_FOUND`**                | Nenhum rosto foi encontrado                                         | PassiveFaceLiveness, FaceAuthenticator                   |
| **`FACE_TOO_FAR`**                  | Rosto muito distante.                                               | PassiveFaceLiveness, FaceAuthenticator                   |
| **`FACE_TOO_CLOSE`**                | Rosto muito próximo.                                                | PassiveFaceLiveness, FaceAuthenticator                   |
| **`ANGULATION_X_FAILURE`**          | Ângulo incorreto do rosto no eixo X.                                | PassiveFaceLiveness                                      |
| **`ANGULATION_Y_FAILURE`**          | Ângulo incorreto do rosto no eixo Y.                                | PassiveFaceLiveness                                      |
| **`ANGULATION_Z_FAILURE`**          | Ângulo incorreto do rosto no eixo Z.                                | PassiveFaceLiveness                                      |
| **`MULTIPLE_FACES_FAILURE`**        | Vários rostos detectados.                                           | PassiveFaceLiveness, FaceAuthenticator                   |
| **`QUALITY_FAILURE`**               | A qualidade da captura do documento é muito baixa.                  | DocumentDetector                                         |
| **`LIVENESS_FAILURE`**              | Erro na prova de vida. É uma provável tentativa de fraude           | PassiveFaceLiveness, FaceAuthenticator                   |
| **`TYPIFICATION_FAILURE`**          | O tipo do documento ou o lado do documento não era esperado.        | DocumentDetector                                         |
| **`PASSPORT_COUNTRY_CODE_FAILURE`** | O código do país do passaporte (ou código emissor) não é permitido. | DocumentDetector                                         |

## **Usando layout no Builder** <a href="#id-9yyg4kyndppa" id="id-9yyg4kyndppa"></a>

Após criar os arquivos desejados, crie um objeto do tipo DocumentDetector. Esse objeto serve para configurar todas as suas regras de negócio para o SDK, incluindo os atributos de personalização da interface:

```java
DocumentDetector mDocumentDetector = new DocumentDetector.Builder(String mobileToken)
    // veja a tabela abaixo
    .build();
```

### **Método do Builder** <a href="#id-1p737r5h7scb" id="id-1p737r5h7scb"></a>

| Parâmetro                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | Obrigatório                                               | Compatibilidade                     |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------- |
| <p><strong><code>.setLayout(@LayoutRes Integer layoutId)</code></strong></p><p>Substitui o layout padrão do SDK. Crie um arquivo na pasta de layout do seu projeto, copie o modelo de layout padrão correspondente ao SDK que você está integrando e faça as alterações desejadas.</p>                                                                                                                                                                                                                                                              | Não. [Aqui](#default-templates) é o padrão para cada SDK. | Versões mais recentes               |
| <p><strong><code>.setStyle(@StyleRes int styleResourceId)</code></strong></p><p>Substitui o estilo padrão do SDK. No arquivo styles.xml do seu projeto, copie o modelo padrão e edite-o.</p>                                                                                                                                                                                                                                                                                                                                                        | Não. [Aqui](#default-templates) é o padrão para cada SDK. | Versões mais recentes               |
| <p><strong><code>.setMask(@DrawableRes Integer greenMask, @DrawableRes Integer whiteMask, @DrawableRes Integer redMask)</code></strong></p><p>Substitui as máscaras para captura de um documento ou rosto: SUCCESS, NORMAL e FAIL, nessa ordem. Se você usar essa opção, utilize máscaras com a mesma área de detecção do documento e do rosto, pois essa região é muito importante para o algoritmo de captura.</p>                                                                                                                                | Não. [Aqui](#default-templates) é o padrão para cada SDK. | DocumentDetector `v7.x ou inferior` |
| <p><strong><code>.setMask(MaskType type)</code></strong></p><p>Define qual grupo de máscaras predefinidas no produto será usado pelo SDK:</p><ul><li><strong><code>MaskType.DEFAULT</code></strong>, com o padrão pontilhado no formato do documento ou rosto;</li><li><strong><code>MaskType.DETAILED</code></strong>, que exibe uma ilustração do documento solicitado - CNH ou RG - junto com a máscara pontilhada (apenas em DocumentDetector);</li><li><strong><code>MaskType.NONE</code></strong>, que remove totalmente a máscara.</li></ul> | Não. As máscaras padrão são usadas.                       | DocumentDetector `v7.x ou inferior` |

### **Usando os métodos** <a href="#jioqu5j9kw3e" id="jioqu5j9kw3e"></a>

```java
DocumentDetector mDocumentDetector = new DocumentDetector.Builder(String mobileToken)
    .setLayout(R.layout.customLayout)
    .setStyle(R.style.customStyle)
    .setMask(MaskType.DETAILED)
    .build();
```

#### **Diferentes usos do método .setMask()** <a href="#id-1egcc6t9mc5l" id="id-1egcc6t9mc5l"></a>

```java
DocumentDetector mDocumentDetector = new DocumentDetector.Builder(String mobileToken)
    // Usando máscaras personalizadas
    .setMask(R.drawable.customGreenMask, R.drawable.customWhiteMask, R.drawable.customRedMask)
    // Usando máscaras já oferecidas pelo SDK
    .setMask(MaskType.DETAILED)
    .build();
```

## **Criação de estilo personalizado** <a href="#foqi1fojdc27" id="foqi1fojdc27"></a>

Para criar um novo estilo, recomendamos que você use o [mesmo modelo](#default-templates) que usamos; assim, será mais fácil fazer personalizações.

## **Personalização das máscaras** <a href="#u81ileo57wyi" id="u81ileo57wyi"></a>

Para personalizar as máscaras, primeiro crie um recurso drawable no seu projeto. Você pode personalizar whiteMask, greenMask e redMask da forma que quiser. Nós fornecemos máscaras genéricas [de documento e rosto](#default-templates) que você pode usar como referência. Veja a **`setMask`** definição do método e exemplos em [<mark style="color:azul;">DocumentDetector.Builder</mark>](#methods). E veja também exemplos de integração de máscara personalizada.

## Modelos padrão

{% tabs %}
{% tab title="DocumentDetector (v7.x ou inferior)" %}
**Activity (`setLayout`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>
        <import type="android.view.View"/>

        <variable
            name="viewModel"
            type="com.combateafraude.documentdetector.controller.viewmodel.SDKViewModel" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:keepScreenOn="true">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.1" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.9" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineTop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.05" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.78" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineBottom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.97" />

        <androidx.camera.view.PreviewView
            android:id="@id/cameraImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="@{viewModel.cameraVisibility ? View.VISIBLE : View.GONE}"
            />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@{viewModel.previewBitMap}"
            android:visibility="@{viewModel.previewVisibility ? View.VISIBLE : View.GONE}">
        </ImageView>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:contentDescription="@string/photo_mask_caf"
            android:scaleType="fitXY"
            android:visibility="@{viewModel.maskVisibility ? View.VISIBLE : View.GONE}"
            android:src="@{context.getDrawable(viewModel.maskLayout)}" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/close_caf"
            android:onClick="@{() -> viewModel.close()}"
            android:src="@drawable/ic_back_caf"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintTop_toTopOf="@id/guidelineTop" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/switch_caf"
            android:onClick="@{() -> viewModel.switchCamera()}"
            android:visibility="@{viewModel.switchCameraButtonVisibility ? View.VISIBLE : View.GONE}"
            android:src="@drawable/ic_camera_switch"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineTop" />

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:visibility="@{viewModel.manualCaptureButtonVisibility ? View.VISIBLE : View.GONE}"
            android:onClick="@{() -> viewModel.takePhoto()}"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineStatus"
            android:contentDescription="@string/take_picture"
            app:backgroundTint="?attr/colorPrimary"
            app:tint="#FFF"
            app:srcCompat="@drawable/ic_camera_caf"/>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:visibility="@{viewModel.statusVisibility ? View.VISIBLE : View.GONE}"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineStatus">

            <TextView
                android:id="@+id/statusMessage"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:background="@drawable/bg_radius_caf"
                android:gravity="center_horizontal"
                android:lineSpacingExtra="5sp"
                android:padding="8dp"
                android:layout_marginTop="10dp"
                android:textAlignment="center"
                android:textColor="#606060"
                android:textSize="15sp"
                android:textStyle="bold"
                android:text="@{viewModel.statusMessage}"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/triangle_caf"
                android:rotation="270"
                android:adjustViewBounds="true"
                android:contentDescription="@string/nothing_caf"
                app:layout_constraintEnd_toEndOf="@id/statusMessage"
                app:layout_constraintStart_toStartOf="@id/statusMessage"
                app:layout_constraintTop_toTopOf="@id/statusMessage"
                app:layout_constraintBottom_toTopOf="@id/statusMessage" />

        </androidx.constraintlayout.widget.ConstraintLayout>

        <TextView
            android:id="@+id/tvCurrentStepName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@id/tvPreviousStepName"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            android:layout_marginBottom="5dp"
            android:textSize="18sp"
            android:textColor="#ffffff"
            android:letterSpacing="0.06"
            android:text="@{viewModel.currentStepName}"
            android:gravity="center_horizontal" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:visibility="@{viewModel.currentStepDone ? View.VISIBLE : View.GONE}"
            android:contentDescription="@string/check_caf"
            app:layout_constraintTop_toTopOf="@id/tvCurrentStepName"
            app:layout_constraintBottom_toBottomOf="@id/tvCurrentStepName"
            app:layout_constraintEnd_toStartOf="@id/tvCurrentStepName"
            android:layout_marginEnd="8dp"
            android:src="@drawable/ic_check_caf" />

        <TextView
            android:id="@+id/tvPreviousStepName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            android:textSize="16sp"
            android:textColor="#66FFFFFF"
            android:letterSpacing="0.06"
            android:text="@{viewModel.previousStepName}"
            android:gravity="center_horizontal" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:visibility="@{viewModel.previousStepDone ? View.VISIBLE : View.GONE}"
            android:contentDescription="@string/check_caf"
            app:layout_constraintTop_toTopOf="@id/tvPreviousStepName"
            app:layout_constraintBottom_toBottomOf="@id/tvPreviousStepName"
            app:layout_constraintEnd_toStartOf="@id/tvPreviousStepName"
            android:layout_marginEnd="8dp"
            android:alpha="0.4"
            android:src="@drawable/ic_check_caf" />

        <ProgressBar
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:indeterminate="true"
            android:indeterminateTint="?attr/colorPrimary"
            android:indeterminateTintMode="src_atop"
            android:visibility="@{viewModel.loadingStatus ? View.VISIBLE : View.GONE}"
            app:layout_constraintVertical_bias="0.45"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            app:layout_constraintTop_toTopOf="@id/guidelineTop"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```

{% endcode %}

**Estilos (`setStyle`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="windowProperties" parent="Theme.MaterialComponents.Light">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowActivityTransitions">true</item>
        <item name="android:colorControlActivated">#606060</item>
    </style>

    <style name="defaultStyle" parent="windowProperties">
        <item name="colorPrimary">#4CD964</item>
    </style>

    <style name="defaultButtonStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:textSize">18sp</item>
        <item name="android:fontFamily">sans-serif</item>
        <item name="android:textAllCaps">false</item>
    </style>

    <style name="transparentButton" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#323232</item>
        <item name="android:textSize">18sp</item>
        <item name="android:textStyle">normal</item>
        <item name="android:fontFamily">@font/roboto</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:background">#00FFFFFF</item>
    </style>

    <style name="textPreview" parent="windowProperties">
        <item name="android:textColor">#323232</item>
    </style>

</resources>
```

{% endcode %}

**Máscara (`setMask`)**

{% code lineNumbers="true" %}

```xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="375dp"
    android:height="667dp"
    android:viewportWidth="375"
    android:viewportHeight="667">
  <path
      android:pathData="M375,0V667H0V0H375ZM341,85H35V516H341V85Z"
      android:strokeAlpha="0.35"
      android:fillColor="#000000"
      android:fillType="evenOdd"
      android:fillAlpha="0.35"/>
  <!-- 
      A cor da máscara pode ser alterada pelo atributo android:fillColor do elemento abaixo.
      As cores padrão são: #22CB7B (verde), #E74C3C (vermelho), #ffffff (branco)
  -->
  <path
      android:pathData="--image-byte-array-"
      android:fillColor="#22CB7B" 
      android:fillType="evenOdd"/>
</vector>
```

{% endcode %}
{% endtab %}

{% tab title="Detector de Documentos (v8.x)" %}
**Activity (`setLayout`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <import type="com.combateafraude.documentdetector.R" />

        <variable
            name="viewModel"
            type="com.combateafraude.documentdetector.controller.viewmodel.SDKViewModel" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/caf_black"
        android:keepScreenOn="true">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.1" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.9" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineTop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.05" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineBottom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.97" />

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:elevation="1dp"
            app:layout_constraintEnd_toEndOf="@id/frameCameraPreview"
            app:layout_constraintStart_toStartOf="@id/frameCameraPreview"
            app:layout_constraintTop_toTopOf="@id/frameCameraPreview">

            <ImageView
                android:id="@+id/closeImage"
                android:layout_width="32dp"
                android:layout_height="32dp"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:adjustViewBounds="true"
                android:contentDescription="@string/close_caf"
                android:onClick="@{() -> viewModel.close()}"
                android:src="@drawable/close_capture"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/tvCurrentStepName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:gravity="center_horizontal"
                android:lineSpacingExtra="5sp"
                android:paddingHorizontal="12dp"
                android:paddingVertical="4dp"
                android:text="@{viewModel.stepName}"
                android:textColor="@color/caf_white"
                android:textSize="16sp"
                android:textStyle="bold"
                android:visibility="@{(viewModel.stepNameVisibility &amp;&amp; viewModel.stepName.length() > 0) ? View.VISIBLE : View.INVISIBLE}"
                app:cafBackgroundColor="@{R.color.mask_color_black_background}"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="CNH" />
        </androidx.constraintlayout.widget.ConstraintLayout>

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineTopCameraPreview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent=".06" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineBottomCameraPreview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent=".94" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStartCameraPreview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent=".04" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineEndCameraPreview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent=".96" />

        <FrameLayout
            android:id="@+id/frameCameraPreview"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottomCameraPreview"
            app:layout_constraintEnd_toEndOf="@id/guidelineEndCameraPreview"
            app:layout_constraintStart_toStartOf="@id/guidelineStartCameraPreview"
            app:layout_constraintTop_toTopOf="@id/guidelineTopCameraPreview">

            <androidx.cardview.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:elevation="0dp"
                app:cardCornerRadius="16dp">

                <androidx.camera.view.PreviewView
                    android:id="@id/cameraImageView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:visibility="@{viewModel.cameraVisibility ? View.VISIBLE : View.GONE}" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="80dp"
                    android:importantForAccessibility="no"
                    android:src="@drawable/preview_camera_gradient" />

                <ImageView
                    android:id="@+id/previewBitmap"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:importantForAccessibility="no"
                    android:src="@{viewModel.previewBitMap}"
                    android:visibility="@{viewModel.previewVisibility ? View.VISIBLE : View.GONE}" />
            </androidx.cardview.widget.CardView>
        </FrameLayout>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/maskInfoContainer"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintTop_toTopOf="@id/guidelineTop">

            <ImageView
                android:id="@+id/maskImage"
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:adjustViewBounds="true"
                android:contentDescription="@string/photo_mask_caf"
                android:src="@{viewModel.feedbackImage}"
                android:visibility="@{viewModel.feedbackImageVisibility ? View.VISIBLE : View.INVISIBLE}"
                app:cafBackgroundColor="@{viewModel.feedbackStatusBackground}"
                app:layout_constraintBottom_toBottomOf="@id/maskInfoContainer"
                app:layout_constraintEnd_toEndOf="@id/maskInfoContainer"
                app:layout_constraintStart_toStartOf="@id/maskInfoContainer"
                app:layout_constraintTop_toTopOf="@id/maskInfoContainer"
                app:layout_constraintVertical_bias="0.40"
                tools:src="@drawable/center_image" />

            <TextView
                android:id="@+id/statusMessage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="8dp"
                android:gravity="center_horizontal"
                android:lineSpacingExtra="5sp"
                android:paddingHorizontal="12dp"
                android:paddingVertical="4dp"
                android:text="@{viewModel.feedbackStatusMessage}"
                android:textAlignment="center"
                android:textColor="#FFFFFF"
                android:textSize="15sp"
                android:textStyle="bold"
                android:visibility="@{viewModel.feedbackStatusMessage.length() > 0 ? View.VISIBLE : View.GONE}"
                app:cafBackgroundColor="@{viewModel.feedbackStatusBackground}"
                app:layout_constraintEnd_toEndOf="@id/maskInfoContainer"
                app:layout_constraintStart_toStartOf="@id/maskInfoContainer"
                app:layout_constraintTop_toBottomOf="@id/maskImage"
                tools:background="@drawable/bg_radius_caf" />
        </androidx.constraintlayout.widget.ConstraintLayout>

        <ImageButton
            android:id="@+id/floatingActionButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:background="@null"
            android:contentDescription="@string/take_picture"
            android:onClick="@{() -> viewModel.takePhoto()}"
            android:src="@drawable/ic_shutter_caf"
            android:visibility="@{viewModel.manualCaptureButtonVisibility ? View.VISIBLE : View.GONE}"
            app:layout_constraintBottom_toBottomOf="@+id/frameCameraPreview"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintStart_toStartOf="@id/guidelineStart" />

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_margin="16dp"
            android:indeterminate="true"
            android:indeterminateTint="@color/caf_white"
            android:indeterminateTintMode="src_atop"
            android:padding="8dp"
            android:visibility="@{viewModel.loadingStatus ? View.VISIBLE : View.GONE}"
            app:cafBackgroundColor="@{viewModel.feedbackStatusBackground}"
            app:layout_constraintBottom_toBottomOf="@id/maskInfoContainer"
            app:layout_constraintEnd_toEndOf="@id/maskInfoContainer"
            app:layout_constraintStart_toStartOf="@id/maskInfoContainer"
            app:layout_constraintTop_toTopOf="@id/maskInfoContainer"
            app:layout_constraintVertical_bias="0.395" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```

{% endcode %}

**Estilo (`setStyle`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="cafDefaultStyle" parent="cafWindowProperties">
        <item name="colorPrimary">#34D690</item>
    </style>

    <style name="cafDefaultButtonStyle" parent="Widget.AppCompat.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:textSize">18sp</item>
        <item name="android:fontFamily">sans-serif</item>
        <item name="android:textAllCaps">false</item>
        <item name="backgroundTint">?attr/colorPrimary</item>
    </style>

    <style name="cafTransparentButtonStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#323232</item>
        <item name="android:textSize">18sp</item>
        <item name="android:textStyle">normal</item>
        <item name="android:fontFamily">@font/roboto</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:background">#00FFFFFF</item>
    </style>

    <style name="cafTextPreviewStyle" parent="cafWindowProperties">
        <item name="android:textColor">#323232</item>
    </style>

    <style name="cafDefaultUploadStyle" parent="cafWindowProperties">
        <item name="android:background">?attr/colorPrimary</item>
    </style>

    <style name="cafDefaultPreviewStyle" parent="cafWindowProperties">
        <item name="android:background">?attr/colorPrimary</item>
    </style>
</resources>
```

{% endcode %}
{% endtab %}

{% tab title="PassiveFaceLiveness" %}
**Activity (`setLayout`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="android.view.View"/>

        <variable
            name="viewModel"
            type="com.combateafraude.passivefaceliveness.controller.viewmodel.SDKViewModel" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:keepScreenOn="true">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.1" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.9" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineTop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.05" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.7" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineBottom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.97" />


        <androidx.camera.view.PreviewView
            android:id="@id/cameraImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="@{viewModel.cameraVisibility ? View.VISIBLE : View.GONE}"
            >

        </androidx.camera.view.PreviewView>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@{viewModel.previewBitMap}"
            android:visibility="@{viewModel.previewVisibility ? View.VISIBLE : View.GONE}">
        </ImageView>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:contentDescription="@string/photo_mask_caf"
            android:scaleType="fitXY"
            android:src="@{context.getDrawable(viewModel.maskLayout)}"
            android:visibility="@{viewModel.maskVisibility ? View.VISIBLE : View.GONE}" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/close_caf"
            android:onClick="@{() -> viewModel.close()}"
            android:src="@drawable/ic_back_caf"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintTop_toTopOf="@id/guidelineTop" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/switch_camera"
            android:onClick="@{() -> viewModel.switchCamera()}"
            android:src="@drawable/ic_camera_switch"
            android:visibility="@{viewModel.switchCameraButtonVisibility ? View.VISIBLE : View.GONE}"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineTop" />

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:visibility="@{viewModel.manualCaptureButtonVisibility ? View.VISIBLE : View.GONE}"
            android:onClick="@{() -> viewModel.takePhoto()}"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineStatus"
            android:contentDescription="@string/take_picture"
            app:backgroundTint="?attr/colorPrimary"
            app:tint="#FFF"
            app:srcCompat="@drawable/ic_camera_caf"/>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:visibility="@{viewModel.statusVisibility ? View.VISIBLE : View.GONE}"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineStatus">

            <TextView
                android:id="@+id/statusMessage"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:background="@drawable/bg_radius_caf"
                android:gravity="center_horizontal"
                android:lineSpacingExtra="7sp"
                android:padding="10dp"
                android:layout_marginTop="10dp"
                android:textAlignment="center"
                android:textColor="#606060"
                android:textSize="15sp"
                android:textStyle="bold"
                android:text="@{viewModel.statusMessage}"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/triangle_caf"
                android:rotation="270"
                android:adjustViewBounds="true"
                android:contentDescription="@string/nothing_caf"
                app:layout_constraintEnd_toEndOf="@id/statusMessage"
                app:layout_constraintStart_toStartOf="@id/statusMessage"
                app:layout_constraintTop_toTopOf="@id/statusMessage"
                app:layout_constraintBottom_toTopOf="@id/statusMessage" />

        </androidx.constraintlayout.widget.ConstraintLayout>

        <TextView
            android:id="@+id/tvCurrentStepName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@id/tvPreviousStepName"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            android:layout_marginBottom="5dp"
            android:textSize="18sp"
            android:textColor="#ffffff"
            android:letterSpacing="0.06"
            android:text="@{viewModel.currentStepName}"
            android:gravity="center_horizontal" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:visibility="@{viewModel.currentStepDone ? View.VISIBLE : View.GONE}"
            android:contentDescription="@string/check_caf"
            app:layout_constraintTop_toTopOf="@id/tvCurrentStepName"
            app:layout_constraintBottom_toBottomOf="@id/tvCurrentStepName"
            app:layout_constraintEnd_toStartOf="@id/tvCurrentStepName"
            android:layout_marginEnd="8dp"
            android:src="@drawable/ic_check_caf" />

        <TextView
            android:id="@+id/tvPreviousStepName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            android:textSize="16sp"
            android:textColor="#66FFFFFF"
            android:letterSpacing="0.06"
            android:text="@{viewModel.previousStepName}"
            android:gravity="center_horizontal" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:visibility="@{viewModel.previousStepDone ? View.VISIBLE : View.GONE}"
            android:contentDescription="@string/check_caf"
            app:layout_constraintTop_toTopOf="@id/tvPreviousStepName"
            app:layout_constraintBottom_toBottomOf="@id/tvPreviousStepName"
            app:layout_constraintEnd_toStartOf="@id/tvPreviousStepName"
            android:layout_marginEnd="8dp"
            android:alpha="0.4"
            android:src="@drawable/ic_check_caf" />

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:indeterminate="true"
            android:indeterminateTint="?attr/colorPrimary"
            android:indeterminateTintMode="src_atop"
            android:visibility="@{viewModel.loadingStatus ? View.VISIBLE : View.GONE}"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintTop_toTopOf="@id/guidelineTop"
            app:layout_constraintVertical_bias="0.45" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```

{% endcode %}

**Estilo (`setStyle`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="windowProperties" parent="Theme.MaterialComponents.Light">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowActivityTransitions">true</item>
        <item name="android:colorControlActivated">#606060</item>
    </style>

    <style name="defaultStyle" parent="windowProperties">
        <item name="colorPrimary">#4CD964</item>
    </style>

    <style name="defaultButtonStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:textSize">18sp</item>
        <item name="android:fontFamily">sans-serif</item>
        <item name="android:textAllCaps">false</item>
    </style>

    <style name="transparentButton" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#323232</item>
        <item name="android:textSize">18sp</item>
        <item name="android:textStyle">normal</item>
        <item name="android:fontFamily">@font/roboto</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:background">#00FFFFFF</item>
    </style>

    <style name="textPreview" parent="windowProperties">
        <item name="android:textColor">#323232</item>
    </style>

</resources>
```

{% endcode %}

**Máscara (`setMask`)**

{% code lineNumbers="true" %}

```xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="375dp"
    android:height="667dp"
    android:viewportWidth="375"
    android:viewportHeight="667">
  <path
      android:pathData="M375,0V667H0V0H375ZM187.5,130C84.91,130 76,208 76,282.5C76,357 131.133,455 187.5,455C243.867,455 299,357 299,282.5C299,208 290.09,130 187.5,130Z"
      android:strokeAlpha="0.35"
      android:fillColor="#000000"
      android:fillType="evenOdd"
      android:fillAlpha="0.35"/>
  <!-- 
      A cor da máscara pode ser alterada pelo atributo android:fillColor do elemento abaixo.
      As cores padrão são: #22CB7B (verde), #E74C3C (vermelho), #ffffff (branco)
  -->
  <path
      android:pathData="--image-byte-array-"
      android:fillColor="#22CB7B"
      android:fillType="evenOdd"/>
</vector>
```

{% endcode %}
{% endtab %}

{% tab title="FaceAuthenticator" %}
**Activity (`setLayout`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>
        <import type="android.view.View"/>

        <variable
            name="viewModel"
            type="com.combateafraude.faceauthenticator.controller.viewmodel.SDKViewModel" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:keepScreenOn="true">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.1" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.9" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineTop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.05" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.7" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineBottom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.97" />

        <androidx.camera.view.PreviewView
            android:id="@id/cameraImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:contentDescription="@string/photo_mask_caf"
            android:scaleType="fitXY"
            android:src="@{context.getDrawable(viewModel.maskLayout)}" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/close_caf"
            android:onClick="@{() -> viewModel.close()}"
            android:src="@drawable/ic_back_caf"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintTop_toTopOf="@id/guidelineTop" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/switch_camera"
            android:onClick="@{() -> viewModel.switchCamera()}"
            android:src="@drawable/ic_camera_switch"
            android:visibility="@{viewModel.switchCameraButtonVisibility ? View.VISIBLE : View.GONE}"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineTop" />


        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:visibility="@{viewModel.manualCaptureButtonVisibility ? View.VISIBLE : View.GONE}"
            android:onClick="@{() -> viewModel.takePhoto()}"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineStatus"
            android:contentDescription="@string/take_picture"
            app:backgroundTint="?attr/colorPrimary"
            app:tint="#FFF"
            app:srcCompat="@drawable/ic_camera_caf"/>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:visibility="@{viewModel.statusVisibility ? View.VISIBLE : View.GONE}"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintTop_toTopOf="@id/guidelineStatus">

            <TextView
                android:id="@+id/statusMessage"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:background="@drawable/bg_radius_caf"
                android:gravity="center_horizontal"
                android:lineSpacingExtra="7sp"
                android:padding="10dp"
                android:layout_marginTop="10dp"
                android:textAlignment="center"
                android:textColor="#606060"
                android:textSize="15sp"
                android:textStyle="bold"
                android:text="@{viewModel.statusMessage}"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/triangle_caf"
                android:rotation="270"
                android:adjustViewBounds="true"
                android:contentDescription="@string/nothing_caf"
                app:layout_constraintEnd_toEndOf="@id/statusMessage"
                app:layout_constraintStart_toStartOf="@id/statusMessage"
                app:layout_constraintTop_toTopOf="@id/statusMessage"
                app:layout_constraintBottom_toTopOf="@id/statusMessage" />

        </androidx.constraintlayout.widget.ConstraintLayout>

        <TextView
            android:id="@+id/tvCurrentStepName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@id/tvPreviousStepName"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            android:layout_marginBottom="5dp"
            android:textSize="18sp"
            android:textColor="#ffffff"
            android:letterSpacing="0.06"
            android:text="@{viewModel.currentStepName}"
            android:gravity="center_horizontal" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:visibility="@{viewModel.currentStepDone ? View.VISIBLE : View.GONE}"
            android:contentDescription="@string/check_caf"
            app:layout_constraintTop_toTopOf="@id/tvCurrentStepName"
            app:layout_constraintBottom_toBottomOf="@id/tvCurrentStepName"
            app:layout_constraintEnd_toStartOf="@id/tvCurrentStepName"
            android:layout_marginEnd="8dp"
            android:src="@drawable/ic_check_caf" />

        <TextView
            android:id="@+id/tvPreviousStepName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            android:textSize="16sp"
            android:textColor="#66FFFFFF"
            android:letterSpacing="0.06"
            android:text="@{viewModel.previousStepName}"
            android:gravity="center_horizontal" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:visibility="@{viewModel.previousStepDone ? View.VISIBLE : View.GONE}"
            android:contentDescription="@string/check_caf"
            app:layout_constraintTop_toTopOf="@id/tvPreviousStepName"
            app:layout_constraintBottom_toBottomOf="@id/tvPreviousStepName"
            app:layout_constraintEnd_toStartOf="@id/tvPreviousStepName"
            android:layout_marginEnd="8dp"
            android:alpha="0.4"
            android:src="@drawable/ic_check_caf" />

        <ProgressBar
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:indeterminate="true"
            android:indeterminateTint="?attr/colorPrimary"
            android:indeterminateTintMode="src_atop"
            android:visibility="@{viewModel.loadingStatus ? View.VISIBLE : View.GONE}"
            app:layout_constraintVertical_bias="0.45"
            app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
            app:layout_constraintTop_toTopOf="@id/guidelineTop"
            app:layout_constraintStart_toStartOf="@id/guidelineStart"
            app:layout_constraintEnd_toEndOf="@id/guidelineEnd" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```

{% endcode %}

**Estilo (`setStyle`)**

{% code lineNumbers="true" %}

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="windowProperties" parent="Theme.MaterialComponents.Light">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowActivityTransitions">true</item>
        <item name="android:colorControlActivated">#606060</item>
    </style>

    <style name="defaultStyle" parent="windowProperties">
        <item name="colorPrimary">#4CD964</item>
    </style>

    <style name="defaultButtonStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:textSize">18sp</item>
        <item name="android:fontFamily">sans-serif</item>
        <item name="android:textAllCaps">false</item>
    </style>

    <style name="transparentButton" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">60dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#323232</item>
        <item name="android:textSize">18sp</item>
        <item name="android:textStyle">normal</item>
        <item name="android:fontFamily">@font/roboto</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:background">#00FFFFFF</item>
    </style>

    <style name="textPreview" parent="windowProperties">
        <item name="android:textColor">#323232</item>
    </style>

</resources>
```

{% endcode %}

**Máscara (`setMask`)**

{% code lineNumbers="true" %}

```xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="375dp"
    android:height="667dp"
    android:viewportWidth="375"
    android:viewportHeight="667">
  <path
      android:pathData="M375,0V667H0V0H375ZM187.5,130C84.91,130 76,208 76,282.5C76,357 131.133,455 187.5,455C243.867,455 299,357 299,282.5C299,208 290.09,130 187.5,130Z"
      android:strokeAlpha="0.35"
      android:fillColor="#000000"
      android:fillType="evenOdd"
      android:fillAlpha="0.35"/>
  <!-- 
      A cor da máscara pode ser alterada pelo atributo android:fillColor do elemento abaixo.
      As cores padrão são: #22CB7B (verde), #E74C3C (vermelho), #ffffff (branco)
  -->
  <path
      android:pathData="--image-byte-array-"
      android:fillColor="#22CB7B"
      android:fillType="evenOdd"/>
</vector>
```

{% endcode %}
{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.caf.io/caf-sdk/caf-sdk-pt-br/android/standalone-modules/document-detector/builder/customization.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
