Core
Tema visual compartido
AutentikarCoreCustomization define el lenguaje visual base utilizado por los flujos primarios de SDK. Sus configuraciones de componentes cubren:
TitleTextCaptionFooterTextButtonConfirmInstructionsLoadingView
Aplica esta configuración una vez a través de AutentikarManager; los módulos que heredan el estilo Core utilizan la misma base visual.
iOS
Aplicar la personalización
let custom = AutentikarCoreCustomization()
custom.backgroundColor = .black
custom.title.color = .white
custom.button.activeColor = .blue
AutentikarManager.shared.setCustomization(custom)
Configura el objeto antes de iniciar un flujo de Autentikar. Puedes modificar únicamente las propiedades que requiera tu diseño; las demás conservarán sus valores predeterminados.
Referencia de propiedades
Apariencia general y contenido
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
backgroundColor | UIColor | .white | Fondo compartido por las pantallas de Core. |
animationColor | [UIColor] | [#082C4C] | Colores utilizados por la animación de procesamiento. |
logoName | String | "Autentikar" | Nombre del recurso de imagen cargado desde el bundle configurado. |
showLogo | Bool | true | Muestra u oculta el logotipo en las pantallas generales de Core. El consentimiento usa confirm.showLogo. |
showFooterClaims | Bool | true | Muestra u oculta los mensajes rotativos del pie de página. |
loadingView | AutentikarLoadingProvider? | nil | Reemplaza la interfaz de carga estándar. |
Tipografía
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
title.font | UIFont | Plus Jakarta Sans SemiBold, 18 pt | Fuente de los títulos de pantalla. |
title.color | UIColor | #3A3A3C | Color de los títulos. |
text.font | UIFont | Plus Jakarta Sans Regular, 16 pt | Fuente del texto general. |
text.fontBold | UIFont | Plus Jakarta Sans SemiBold, 16 pt | Fuente en negrita del texto atribuido. |
text.color | UIColor | #3A3A3C | Color del texto general. |
caption.font | UIFont | Plus Jakarta Sans Light, 16 pt | Fuente de los textos secundarios. |
caption.color | UIColor | #3A3A3C | Color de los textos secundarios. |
footerText.font | UIFont | Plus Jakarta Sans Regular, 16 pt | Fuente de los mensajes rotativos del pie de página. |
footerText.color | UIColor | #3A3A3C | Color de los mensajes del pie de página. |
footerText.claims | [String] | Cinco mensajes localizados de Core | Mensajes que aparecen de forma rotativa en el pie de página. |
Botones
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
button.font | UIFont | Plus Jakarta Sans Regular, 16 pt | Fuente del texto de los botones. |
button.activeTextColor | UIColor | .white | Color del texto de los botones principales habilitados. |
button.activeColor | UIColor | #082C4C | Color de fondo de los botones principales habilitados. |
button.disableTextColor | UIColor | .white | Color del texto de los botones deshabilitados. |
button.disabledColor | UIColor | #5F6368 | Color de fondo de los botones deshabilitados. |
button.cornerRadius | CGFloat | 10 | Radio de las esquinas de los botones estándar en puntos. |
button.outlineColor | UIColor | #082C4C | Color del borde y del texto de los botones con contorno. |
Controles de confirmación
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
confirm.toggleColorOn | UIColor | #082C4C | Color del interruptor en estado activo. |
confirm.toggleColorOff | UIColor | #5F6368 | Color del interruptor en estado inactivo. |
confirm.linkTextColor | UIColor | #082C4C | Color de los enlaces del contenido de confirmación. |
confirm.showLogo | Bool | true | Muestra u oculta el logotipo únicamente en la pantalla de consentimiento. Disponible desde Core 1.0.15. |
1.0.15, si utilizabas showLogo = false para ocultar el logotipo en todo el flujo, configura también confirm.showLogo = false.Pantallas de instrucciones estándar
Estos colores se aplican a las pantallas estándar de instrucciones de documento y prueba de vida. Desde Core 1.0.15, esas pantallas ya no muestran un botón de cierre. Las propiedades de provider reemplazan por completo esas pantallas y se explican en Pantallas de instrucciones personalizadas.
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
instructions.iconColor | UIColor | #082C4C | Color de los íconos de cada instrucción. |
instructions.closeIconColor | UIColor | #082C4C | Propiedad conservada por compatibilidad; las pantallas estándar ya no muestran el ícono de cierre desde 1.0.15. |
instructions.photoIDScanViewProvider | AutentikarInstructionViewProvider? | nil | Reemplaza la pantalla de instrucciones de documento. |
instructions.livenessCheckViewProvider | AutentikarInstructionViewProvider? | nil | Reemplaza la pantalla de instrucciones de prueba de vida. |
Imagen remota en instrucciones iOS
Desde Core 1.0.15, las pantallas estándar de instrucciones de documento y prueba de vida pueden mostrar la imagen remota que el paso activo entrega mediante header_image. Esta configuración proviene del servidor; no es necesario asignarla en AutentikarCoreCustomization.
{
"header_image": {
"alt": "header",
"src": "https://example.com/instructions.png",
"type": "image/png"
}
}
Cuando alt es header y src contiene una imagen válida, la imagen reemplaza el título, la descripción y la lista de instrucciones estándar. El botón para continuar permanece visible. Si la imagen no está disponible o no se puede cargar, el SDK recupera automáticamente el contenido estándar.
photoIDScanViewProvider o livenessCheckViewProvider configurado tiene prioridad y reemplaza toda la pantalla estándar. Core no inserta header_image dentro de una vista personalizada; la aplicación controla por completo su contenido.Ejemplo visual completo
import AutentikarCore
import UIKit
let custom = AutentikarCoreCustomization()
custom.backgroundColor = .systemBackground
custom.animationColor = [.systemCyan, .systemBlue]
custom.logoName = "CompanyLogo"
custom.showLogo = true
custom.showFooterClaims = true
custom.title.font = .boldSystemFont(ofSize: 20)
custom.title.color = .label
custom.text.font = .systemFont(ofSize: 16)
custom.text.fontBold = .boldSystemFont(ofSize: 16)
custom.text.color = .label
custom.caption.font = .systemFont(ofSize: 14)
custom.caption.color = .secondaryLabel
custom.footerText.font = .systemFont(ofSize: 14)
custom.footerText.color = .secondaryLabel
custom.footerText.claims = [
"Tu información está protegida.",
"Este proceso solo tomará un momento."
]
custom.button.font = .boldSystemFont(ofSize: 16)
custom.button.activeTextColor = .white
custom.button.activeColor = .systemBlue
custom.button.disableTextColor = .tertiaryLabel
custom.button.disabledColor = .systemGray5
custom.button.cornerRadius = 24
custom.button.outlineColor = .systemBlue
custom.confirm.toggleColorOn = .systemBlue
custom.confirm.toggleColorOff = .systemGray
custom.confirm.linkTextColor = .systemBlue
custom.confirm.showLogo = true
custom.instructions.iconColor = .systemBlue
AutentikarManager.shared.setCustomization(custom)
Vista de carga personalizada
A partir de Core 1.0.11, loadingView acepta un proveedor SwiftUI o UIKit.
// SwiftUI
let custom = AutentikarCoreCustomization()
custom.loadingView = AutentikarSwiftUILoadingProvider {
ProgressView()
.tint(.blue)
.scaleEffect(2)
}
AutentikarManager.shared.setCustomization(custom)
// UIKit
let custom = AutentikarCoreCustomization()
let spinner = UIActivityIndicatorView(style: .large)
spinner.startAnimating()
spinner.color = .red
custom.loadingView = AutentikarUIKitLoadingProvider(view: spinner)
AutentikarManager.shared.setCustomization(custom)
Pantallas de instrucciones personalizadas
A partir de Core 1.0.14, puedes reemplazar por completo la pantalla de instrucciones que aparece antes de la captura del documento o de la prueba de vida. El SDK admite implementaciones en SwiftUI, UIView, UIViewController y Objective-C.
| Pantalla | Propiedad de configuración |
|---|---|
| Captura de documento | custom.instructions.photoIDScanViewProvider |
| Prueba de vida | custom.instructions.livenessCheckViewProvider |
Cada provider recibe un objeto AutentikarInstructionActions. Conecta los controles de tu interfaz con estas acciones para que el SDK mantenga el control del flujo:
actions.agree()cierra las instrucciones e inicia el paso de captura correspondiente.actions.dismiss()cierra las instrucciones sin iniciar el paso de captura.
nil, el SDK muestra su pantalla de instrucciones estándar; por lo tanto, puedes personalizar cada pantalla de forma independiente.Selecciona la implementación que corresponda a la tecnología de interfaz de tu aplicación:
import AutentikarCore
import SwiftUI
struct BrandedInstructionView: View {
let title: String
let actions: AutentikarInstructionActions
var body: some View {
VStack(spacing: 24) {
Text(title)
.font(.title.bold())
Text("Sigue las indicaciones de tu organización.")
.multilineTextAlignment(.center)
Button("Continuar") {
actions.agree()
}
.buttonStyle(.borderedProminent)
Button("Cancelar", role: .cancel) {
actions.dismiss()
}
}
.padding(32)
}
}
let custom = AutentikarCoreCustomization()
custom.instructions.photoIDScanViewProvider =
AutentikarSwiftUIInstructionViewProvider { actions in
BrandedInstructionView(
title: "Fotografía tu documento",
actions: actions
)
}
custom.instructions.livenessCheckViewProvider =
AutentikarSwiftUIInstructionViewProvider { actions in
BrandedInstructionView(
title: "Centra tu rostro",
actions: actions
)
}
AutentikarManager.shared.setCustomization(custom)
import AutentikarCore
import UIKit
func makeInstructionView(
actions: AutentikarInstructionActions
) -> UIView {
let title = UILabel()
title.text = "Fotografía tu documento"
title.font = .preferredFont(forTextStyle: .title1)
title.textAlignment = .center
let continueButton = UIButton(configuration: .filled())
continueButton.configuration?.title = "Continuar"
continueButton.addAction(UIAction { _ in
actions.agree()
}, for: .touchUpInside)
let cancelButton = UIButton(configuration: .plain())
cancelButton.configuration?.title = "Cancelar"
cancelButton.addAction(UIAction { _ in
actions.dismiss()
}, for: .touchUpInside)
let stack = UIStackView(arrangedSubviews: [
title, continueButton, cancelButton
])
stack.axis = .vertical
stack.spacing = 24
stack.translatesAutoresizingMaskIntoConstraints = false
let view = UIView()
view.backgroundColor = .systemBackground
view.addSubview(stack)
NSLayoutConstraint.activate([
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32),
stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32),
stack.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
return view
}
let custom = AutentikarCoreCustomization()
custom.instructions.photoIDScanViewProvider =
AutentikarUIKitInstructionViewProvider { actions in
makeInstructionView(actions: actions)
}
AutentikarManager.shared.setCustomization(custom)
import AutentikarCore
import UIKit
final class BrandedInstructionViewController: UIViewController {
private let actions: AutentikarInstructionActions
init(actions: AutentikarInstructionActions) {
self.actions = actions
super.init(nibName: nil, bundle: nil)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let continueButton = UIButton(configuration: .filled())
continueButton.configuration?.title = "Continuar"
continueButton.addAction(UIAction { [actions] _ in
actions.agree()
}, for: .touchUpInside)
let cancelButton = UIButton(configuration: .plain())
cancelButton.configuration?.title = "Cancelar"
cancelButton.addAction(UIAction { [actions] _ in
actions.dismiss()
}, for: .touchUpInside)
let stack = UIStackView(arrangedSubviews: [
continueButton, cancelButton
])
stack.axis = .vertical
stack.spacing = 16
stack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stack)
NSLayoutConstraint.activate([
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32),
stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32),
stack.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
}
let custom = AutentikarCoreCustomization()
custom.instructions.livenessCheckViewProvider =
AutentikarInstructionControllerProvider { actions in
BrandedInstructionViewController(actions: actions)
}
AutentikarManager.shared.setCustomization(custom)
AutentikarSwiftUIInstructionViewProvider acepta cualquier View de SwiftUI. Para UIKit, usa AutentikarUIKitInstructionViewProvider con una vista o AutentikarInstructionControllerProvider cuando necesites que el SDK integre el ciclo de vida de un UIViewController.
Objective-C
Los providers de UIKit y los métodos de las acciones están expuestos a Objective-C. Importa la interfaz generada del framework y configura el provider antes de iniciar el flujo de Autentikar.
@import AutentikarCore;
@import UIKit;
AutentikarCoreCustomization *custom =
[[AutentikarCoreCustomization alloc] init];
custom.instructions.photoIDScanViewProvider =
[[AutentikarUIKitInstructionViewProvider alloc]
initWithViewBuilder:^UIView *(
AutentikarInstructionActions *actions
) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"Continuar" forState:UIControlStateNormal];
[button addAction:[UIAction actionWithHandler:^(__kindof UIAction *action) {
[actions agree];
}] forControlEvents:UIControlEventTouchUpInside];
UIButton *cancel = [UIButton buttonWithType:UIButtonTypeSystem];
[cancel setTitle:@"Cancelar" forState:UIControlStateNormal];
[cancel addAction:[UIAction actionWithHandler:^(__kindof UIAction *action) {
[actions dismiss];
}] forControlEvents:UIControlEventTouchUpInside];
UIStackView *stack = [[UIStackView alloc]
initWithArrangedSubviews:@[button, cancel]];
stack.axis = UILayoutConstraintAxisVertical;
stack.spacing = 16;
UIView *view = [[UIView alloc] init];
view.backgroundColor = UIColor.systemBackgroundColor;
stack.translatesAutoresizingMaskIntoConstraints = NO;
[view addSubview:stack];
[NSLayoutConstraint activateConstraints:@[
[stack.leadingAnchor constraintEqualToAnchor:view.leadingAnchor
constant:32],
[stack.trailingAnchor constraintEqualToAnchor:view.trailingAnchor
constant:-32],
[stack.centerYAnchor constraintEqualToAnchor:view.centerYAnchor]
]];
return view;
}];
[[AutentikarManager shared] setCustomization:custom];
custom.instructions.livenessCheckViewProvider =
[[AutentikarInstructionControllerProvider alloc]
initWithViewControllerBuilder:^UIViewController *(
AutentikarInstructionActions *actions
) {
return [[MyInstructionViewController alloc]
initWithActions:actions];
}];
En la pestaña UIViewController, MyInstructionViewController debe crear una instancia nueva y conectar sus controles con las acciones recibidas.
Conserva el objeto actions en tu vista o controlador durante el tiempo que lo necesiten sus botones. No presentes el módulo de captura por tu cuenta: al llamar agree(), Autentikar continúa con el paso correcto de documento o prueba de vida.
Android
Aplicar la personalización
import androidx.core.graphics.toColorInt
val custom = AutentikarCoreCustomization()
custom.backgroundColor = "#E84E1A".toColorInt()
custom.title.color = "#E84E1A".toColorInt()
custom.button.activeColor = "#E84E1A".toColorInt()
AutentikarManager.setCustomization(custom)
Configura el objeto antes de iniciar un flujo de Autentikar. En Android, los colores son valores @ColorInt, no identificadores de recursos. Resuelve un recurso de color con ContextCompat.getColor(...) o convierte un color hexadecimal con toColorInt().
Referencia de propiedades
Apariencia general
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
backgroundColor | Int (@ColorInt) | #FFFFFF | Fondo compartido por las pantallas de Core. |
animationColor | List<Int> | [#082C4C, #082C4C] | Colores utilizados por la animación de carga. |
logoName | Int (@DrawableRes) | R.drawable.autentikar | Recurso drawable que se muestra como logotipo. |
showLogo | Boolean | true | Muestra u oculta el logotipo en las pantallas generales de Core. El consentimiento usa confirm.showLogo. |
loadingView | View? | null | Reemplaza la animación de carga estándar. |
Tipografía
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
title.typeface | Typeface? | null | Fuente de los títulos; Core utiliza su fuente semibold incluida cuando no se configura. |
title.color | Int (@ColorInt) | #3A3A3C | Color de los títulos. |
text.typeface | Typeface? | null | Fuente del texto general; Core utiliza su fuente regular incluida cuando no se configura. |
text.color | Int (@ColorInt) | #3A3A3C | Color del texto general. |
caption.typeface | Typeface? | null | Fuente del texto secundario; Core utiliza su fuente light incluida cuando no se configura. |
caption.color | Int (@ColorInt) | Color.GRAY | Color del texto secundario. |
footerText.typeface | Typeface? | null | Fuente de los mensajes rotativos del pie de página. |
footerText.color | Int (@ColorInt) | #3A3A3C | Color de los mensajes del pie de página. |
Botones
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
button.typeface | Typeface? | null | Fuente de los botones; Core utiliza su fuente regular incluida cuando no se configura. |
button.activeTextColor | Int (@ColorInt) | #FFFFFF | Color del texto de los botones principales habilitados. |
button.activeColor | Int (@ColorInt) | #082C4C | Color de fondo de los botones principales habilitados. |
button.disabledTextColor | Int (@ColorInt) | #FFFFFF | Color del texto de los botones deshabilitados. |
button.disabledColor | Int (@ColorInt) | #5F6368 | Color de fondo de los botones deshabilitados. |
button.cornerRadius | Float | 20F | Radio de las esquinas de los botones en píxeles. |
button.outlineColor | Int (@ColorInt) | #082C4C | Color del texto de los botones con contorno. |
Controles de confirmación
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
confirm.checkBoxColor | Int (@ColorInt) | #082C4C | Color aplicado al checkbox de consentimiento. |
confirm.linkTextColor | Int (@ColorInt) | #082C4C | Color de los enlaces del contenido de consentimiento. |
confirm.showLogo | Boolean | true | Muestra u oculta el logotipo únicamente en la pantalla de consentimiento. Disponible desde Core 1.0.20. |
1.0.20, si utilizabas showLogo = false para ocultar el logotipo en todo el flujo, configura también confirm.showLogo = false.Pantallas de instrucciones estándar
Las propiedades de color modifican los layouts XML estándar de instrucciones. Desde Core 1.0.20, esos layouts ya no muestran un botón de cierre. Las propiedades de provider reemplazan por completo esos layouts y se explican en Pantallas de instrucciones Android personalizadas.
| Propiedad | Tipo | Valor predeterminado | Función |
|---|---|---|---|
instructions.iconColor | Int (@ColorInt) | #082C4C | Color aplicado a los íconos de cada instrucción. |
instructions.closeIconColor | Int (@ColorInt) | #082C4C | Propiedad conservada por compatibilidad; las pantallas estándar ya no muestran el ícono de cierre desde 1.0.20. |
instructions.photoIDScanViewProvider | AutentikarInstructionViewProvider? | null | Reemplaza la pantalla de instrucciones de documento. |
instructions.livenessCheckViewProvider | AutentikarInstructionViewProvider? | null | Reemplaza la pantalla de instrucciones de prueba de vida. |
Imagen remota en instrucciones Android
Desde Core 1.0.20, los layouts estándar de instrucciones de documento y prueba de vida pueden mostrar la imagen remota que el paso activo entrega mediante header_image. Esta configuración proviene del servidor; no es necesario asignarla en AutentikarCoreCustomization.
{
"header_image": {
"alt": "header",
"src": "https://example.com/instructions.png",
"type": "image/png"
}
}
Cuando alt es header y src contiene una imagen válida, la imagen reemplaza el título, la descripción y la lista de instrucciones estándar. El botón para continuar permanece visible. Si la imagen no está disponible o no se puede cargar, el SDK recupera automáticamente el contenido estándar.
photoIDScanViewProvider o livenessCheckViewProvider configurado tiene prioridad y reemplaza todo el layout estándar. Core no inserta header_image dentro de una vista personalizada; la aplicación controla por completo su contenido.Ejemplo visual completo
import android.graphics.Color
import android.graphics.Typeface
import androidx.core.graphics.toColorInt
val custom = AutentikarCoreCustomization().apply {
backgroundColor = "#F8FAFC".toColorInt()
animationColor = listOf(
"#2563EB".toColorInt(),
"#06B6D4".toColorInt()
)
logoName = R.drawable.company_logo
showLogo = true
title.typeface = Typeface.DEFAULT_BOLD
title.color = "#0F172A".toColorInt()
text.typeface = Typeface.DEFAULT
text.color = "#334155".toColorInt()
caption.typeface = Typeface.DEFAULT
caption.color = "#64748B".toColorInt()
footerText.typeface = Typeface.DEFAULT
footerText.color = "#64748B".toColorInt()
button.typeface = Typeface.DEFAULT_BOLD
button.activeTextColor = Color.WHITE
button.activeColor = "#2563EB".toColorInt()
button.disabledTextColor = "#94A3B8".toColorInt()
button.disabledColor = "#E2E8F0".toColorInt()
button.cornerRadius = 24F
button.outlineColor = "#2563EB".toColorInt()
confirm.checkBoxColor = "#2563EB".toColorInt()
confirm.linkTextColor = "#2563EB".toColorInt()
confirm.showLogo = true
instructions.iconColor = "#2563EB".toColorInt()
}
AutentikarManager.setCustomization(custom)
Vista de carga personalizada
Desde Core 1.0.15, loadingView acepta un View de Android.
import android.content.res.ColorStateList
import android.graphics.Color
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
// Conserva una referencia fuerte mientras Autentikar pueda usar la vista.
private val customLoadingView by lazy {
ProgressBar(this).apply {
isIndeterminate = true
indeterminateTintList =
ColorStateList.valueOf(Color.RED)
}
}
private fun configureAutentikar() {
val custom = AutentikarCoreCustomization()
custom.loadingView = customLoadingView
AutentikarManager.setCustomization(custom)
}
}
loadingView mediante una referencia débil. Mantén una referencia fuerte en tu activity, fragment u otro propietario mientras el SDK pueda mostrarla. El SDK retira la vista de su parent anterior antes de añadirla al contenedor de carga.Pantallas de instrucciones Android personalizadas
A partir de Core 1.0.19, configura un AutentikarInstructionViewProvider para reemplazar cualquiera de las pantallas de instrucciones con un View de Android. Cada provider es independiente: puedes personalizar solo una pantalla o las dos.
| Pantalla | Propiedad de configuración |
|---|---|
| Captura de documento | custom.instructions.photoIDScanViewProvider |
| Prueba de vida | custom.instructions.livenessCheckViewProvider |
El método createView del provider recibe estos valores:
| Parámetro | Uso |
|---|---|
inflater | LayoutInflater que puedes usar para inflar un layout XML. |
parent | Contenedor donde Core presentará la vista. Pásalo como root al inflar, con attachToRoot = false. |
actions | Acciones que devuelven el control del flujo al SDK. |
La vista debe llamar una de estas acciones:
actions.agree()cierra las instrucciones y continúa con la captura de documento o la prueba de vida.actions.dismiss()cierra las instrucciones sin iniciar el paso de captura.
Layout XML reutilizable
Puedes usar el mismo layout para ambas pantallas y cambiar su contenido desde cada provider:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="24dp">
<TextView
android:id="@+id/instructionTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/continueButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="@string/continue_action" />
<Button
android:id="@+id/closeButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cancel_action" />
</LinearLayout>
Agrega también los textos usados por el ejemplo:
<resources>
<string name="photo_id_instructions_title">Prepara tu documento de identidad</string>
<string name="liveness_instructions_title">Prepara la prueba de vida</string>
<string name="continue_action">Continuar</string>
<string name="cancel_action">Cancelar</string>
</resources>
Configurar ambos providers con Kotlin
Este helper crea una vista nueva en cada presentación y conecta los botones con el flujo administrado por Core:
import android.view.View
import android.widget.TextView
import androidx.annotation.StringRes
import com.autentikar.core_v2.common.managers.AutentikarManager
import com.autentikar.core_v2.common.views.AutentikarInstructionViewProvider
import com.autentikar.core_v2.utilities.customizations.AutentikarCoreCustomization
private fun instructionProvider(
@StringRes titleRes: Int
) = AutentikarInstructionViewProvider { inflater, parent, actions ->
inflater.inflate(
R.layout.view_custom_instructions,
parent,
false
).apply {
findViewById<TextView>(R.id.instructionTitle).setText(titleRes)
findViewById<View>(R.id.continueButton)
.setOnClickListener { actions.agree() }
findViewById<View>(R.id.closeButton)
.setOnClickListener { actions.dismiss() }
}
}
val custom = AutentikarCoreCustomization()
custom.instructions.photoIDScanViewProvider =
instructionProvider(R.string.photo_id_instructions_title)
custom.instructions.livenessCheckViewProvider =
instructionProvider(R.string.liveness_instructions_title)
AutentikarManager.setCustomization(custom)
Si solo necesitas personalizar una de las pantallas, asigna únicamente su provider. La otra seguirá usando el diseño estándar.
Crear la vista por código
No es obligatorio usar XML. El provider también puede construir y devolver una jerarquía de vistas nueva:
import android.view.Gravity
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import com.autentikar.core_v2.common.views.AutentikarInstructionViewProvider
custom.instructions.livenessCheckViewProvider =
AutentikarInstructionViewProvider { _, parent, actions ->
val padding = (24 * parent.resources.displayMetrics.density).toInt()
LinearLayout(parent.context).apply {
orientation = LinearLayout.VERTICAL
gravity = Gravity.CENTER
setPadding(padding, padding, padding, padding)
addView(TextView(context).apply {
text = context.getString(R.string.liveness_instructions_title)
})
addView(Button(context).apply {
text = context.getString(R.string.continue_action)
setOnClickListener { actions.agree() }
})
addView(Button(context).apply {
text = context.getString(R.string.cancel_action)
setOnClickListener { actions.dismiss() }
})
}
}
Configurar un provider desde Java
Las propiedades exponen getters y setters compatibles con Java. El mismo patrón funciona con setLivenessCheckViewProvider.
import android.view.View;
import com.autentikar.core_v2.common.managers.AutentikarManager;
import com.autentikar.core_v2.utilities.customizations.AutentikarCoreCustomization;
AutentikarCoreCustomization custom = new AutentikarCoreCustomization();
custom.getInstructions().setPhotoIDScanViewProvider(
(inflater, parent, actions) -> {
View view = inflater.inflate(
R.layout.view_custom_instructions,
parent,
false
);
view.findViewById(R.id.continueButton)
.setOnClickListener(button -> actions.agree());
view.findViewById(R.id.closeButton)
.setOnClickListener(button -> actions.dismiss());
return view;
}
);
AutentikarManager.setCustomization(custom);
parent: Core se encarga de insertarla y retirarla. Si un provider es null, Core usa la pantalla estándar correspondiente. No inicies una actividad de captura desde la vista personalizada; usa agree() o dismiss() para que Autentikar controle el flujo activo.Contenido localizado
La personalización visual y la personalización de texto son independientes. Utilice los archivos de localización de la plataforma para reemplazar la copia orientada al usuario sin cadenas de codificación dura en el objeto de personalización: