- Add the following to the module
build.gradle.ktsfile:dependencies { ... implementation("net.idscan.components.android:dvsonline:1.14.0") ... }
DvsOnlineConfig.Builder is used for configuration of the DvsOnlineFragment object. DvsOnlineConfig.Builder
accepts the required Authorization Token, Integration Id, Applicant Id and Company Prefix
parameters and provides additional methods for configuration of the DIVE Online fragment.
Authenticating requests to the DIVE API are done using the public key / secret key as a Bearer token in the
Authorization Header. This key should be defined by the authorizationToken parameter. applicantId is a unique
ID generated on each request creation.
DvsOnlineConfig config = new DvsOnlineConfig
.Builder(authorizationToken, integrationToken, applicantId, companyPrefix)
.withCustomUserAgent(-- CutstomUserAgent --)
.withCustomUrl(-- CutomUrl --)
.build();
Allows you to configure the user-agent header in an HTTP request.
Default value is CompanyPrefix.AppName/AppVersion (Android; DeviceModel, OS Name).
Allows you to redefine a DIVE API endpoint.
Default value is https://api-diveonline.idscan.net/api/v2.
DvsOnlineFragment.newInstance(config) accepts the DvsOnlineConfig parameter and returns the instance of
DIVE Online fragment that can be used with android
FragmentManager in a typical way.
Fragment fragment = DvsOnlineFragment.newInstance(config);
getSupportFragmentManager()
.beginTransaction()
.setPrimaryNavigationFragment(fragment)
.replace(R.id.fragment_container_view, fragment, "DvsOnlineFragment")
.addToBackStack("DvsOnlineFragment")
.commit();
Note that we use .setPrimaryNavigationFragment(fragment) here to give DvsOnlineFragment
a chance to process back stack navigation before the parent fragment manager.
DvsOnlineFragment provides a useful setFragmentResultListener method that allows you get the result of the
verification in a convenient way.
DvsOnlineFragment {
...
public interface SuccessCallback {
void onSuccess(@NonNull ValidationResult result);
}
public interface ErrorCallback {
void onError(@NonNull DvsOnlineException error);
}
...
public static void setFragmentResultListener(
@NonNull FragmentManager fragmentManager,
@NonNull LifecycleOwner lifecycleOwner,
@NonNull SuccessCallback successCallback,
@NonNull ErrorCallback errorCallback
) {
...
}
}
Under the hood setFragmentResultListener uses
Fragment Result API
and accepts SuccessCallback and ErrorCallback callbacks to process the result of the verification.
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
// Setup result listener.
DvsOnlineFragment.setFragmentResultListener(
getSupportFragmentManager(),
this,
this::showDvsOnlineResultFragment,
this::showDvsOnlineErrorFragment
);
// Prepare config.
DvsOnlineConfig config = new DvsOnlineConfig
.Builder(**authorizationToken**, **integrationToken**, **applicantId**, **companyPrefix**)
.build();
// Show fragment.
showDvsOnlineFragment(config);
}
private void showDvsOnlineFragment(@NonNull DvsOnlineConfig config) {
FragmentManager fm = getSupportFragmentManager();
if (fm.findFragmentByTag("DvsOnlineFragment") == null) {
Fragment fragment = DvsOnlineFragment.newInstance(config);
getSupportFragmentManager()
.beginTransaction()
.setPrimaryNavigationFragment(fragment)
.replace(R.id.fragment_container_view, fragment, "DvsOnlineFragment")
.addToBackStack("DvsOnlineFragment")
.commit();
}
}
private void showDvsOnlineResultFragment(@NonNull ValidationResult result) {
// Process the result.
}
private void showDvsOnlineErrorFragment(@NonNull DvsOnlineException error) {
// Process the error.
}
}
UI representation of the DIVE Online fragment is based on the Material Design 2 and can be customized using a theme. The DIVE SDK provides a
basic Theme.DVS theme that can be extended to customize the UI.
DIVE SDK typography is based on the Material Design.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextAppearance.DVS.Headline1" parent="TextAppearance.MaterialComponents.Headline1">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_bold</item>
<item name="fontFamily">@font/inter_bold</item>
<item name="android:textSize">32sp</item>
</style>
<style name="TextAppearance.DVS.Headline2" parent="TextAppearance.MaterialComponents.Headline2">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_bold</item>
<item name="fontFamily">@font/inter_bold</item>
<item name="android:textSize">32sp</item>
</style>
<style name="TextAppearance.DVS.Headline3" parent="TextAppearance.MaterialComponents.Headline3">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_bold</item>
<item name="fontFamily">@font/inter_bold</item>
<item name="android:textSize">28sp</item>
</style>
<style name="TextAppearance.DVS.Headline4" parent="TextAppearance.MaterialComponents.Headline4">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_bold</item>
<item name="fontFamily">@font/inter_bold</item>
<item name="android:textSize">24sp</item>
</style>
<style name="TextAppearance.DVS.Headline5" parent="TextAppearance.MaterialComponents.Headline5">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_semi_bold</item>
<item name="fontFamily">@font/inter_semi_bold</item>
<item name="android:textSize">18sp</item>
</style>
<style name="TextAppearance.DVS.Headline6" parent="TextAppearance.MaterialComponents.Headline6">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_semi_bold</item>
<item name="fontFamily">@font/inter_semi_bold</item>
<item name="android:textSize">16sp</item>
</style>
<style name="TextAppearance.DVS.Body1" parent="TextAppearance.MaterialComponents.Body1">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_regular</item>
<item name="fontFamily">@font/inter_regular</item>
<item name="android:textSize">14sp</item>
</style>
<style name="TextAppearance.DVS.Button" parent="TextAppearance.MaterialComponents.Button">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_regular</item>
<item name="fontFamily">@font/inter_regular</item>
<item name="android:textSize">14sp</item>
</style>
<style name="TextAppearance.DVS.Caption" parent="TextAppearance.MaterialComponents.Caption">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_regular</item>
<item name="fontFamily">@font/inter_regular</item>
<item name="android:textSize">12sp</item>
</style>
<style name="TextAppearance.DVS.Subtitle1" parent="TextAppearance.MaterialComponents.Subtitle1">
<item name="android:textColor">?colorOnSurface</item>
<item name="android:fontFamily">@font/inter_semi_bold</item>
<item name="fontFamily">@font/inter_semi_bold</item>
<item name="android:textSize">16sp</item>
</style>
<style name="TextAppearance.DVS.Body2" parent="TextAppearance.MaterialComponents.Body2">
<item name="android:fontFamily">@font/inter_regular</item>
<item name="fontFamily">@font/inter_regular</item>
<item name="android:textSize">14sp</item>
</style>
<style name="TextAppearance.DVS.Subtitle2" parent="TextAppearance.MaterialComponents.Subtitle2">
<item name="android:fontFamily">@font/inter</item>
<item name="fontFamily">@font/inter</item>
</style>
<style name="TextAppearance.DVS.Overline" parent="TextAppearance.MaterialComponents.Overline">
<item name="android:fontFamily">@font/inter</item>
<item name="fontFamily">@font/inter</item>
</style>
<style name="Theme.DVS" parent="Theme.MaterialComponents.Light.NoActionBar">
...
<item name="textAppearanceHeadline1">@style/TextAppearance.DVS.Headline1</item>
<item name="textAppearanceHeadline2">@style/TextAppearance.DVS.Headline2</item>
<item name="textAppearanceHeadline3">@style/TextAppearance.DVS.Headline3</item>
<item name="textAppearanceHeadline4">@style/TextAppearance.DVS.Headline4</item>
<item name="textAppearanceHeadline5">@style/TextAppearance.DVS.Headline5</item>
<item name="textAppearanceHeadline6">@style/TextAppearance.DVS.Headline6</item>
<item name="textAppearanceSubtitle1">@style/TextAppearance.DVS.Subtitle1</item>
<item name="textAppearanceSubtitle2">@style/TextAppearance.DVS.Subtitle2</item>
<item name="textAppearanceBody1">@style/TextAppearance.DVS.Body1</item>
<item name="textAppearanceBody2">@style/TextAppearance.DVS.Body2</item>
<item name="textAppearanceButton">@style/TextAppearance.DVS.Button</item>
<item name="textAppearanceCaption">@style/TextAppearance.DVS.Caption</item>
<item name="textAppearanceOverline">@style/TextAppearance.DVS.Overline</item>
...
</style>
</resources>
These styles can be redefined in the custom theme or can be used in your application theme.
<resources xmlns:tools="http://schemas.android.com/tools">
...
<style name="TextAppearance.CustomDiveTheme.Headline1" parent="TextAppearance.DVS.Headline1">
<item name="android:textColor">?colorPrimary</item>
<item name="android:textSize">48sp</item>
</style>
...
<style name="Theme.CustomDiveTheme" parent="Theme.DVS">
...
<item name="textAppearanceHeadline1">@style/TextAppearance.CustomDiveTheme.Headline1</item>
...
</style>
...
</resources>
DIVE SDK shapes are based on the Material Design.
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<style name="ShapeAppearance.DVS.SmallComponent" parent="ShapeAppearance.MaterialComponents.SmallComponent">
<item name="cornerSize">6dp</item>
</style>
<style name="ShapeAppearance.DVS.MediumComponent" parent="ShapeAppearance.MaterialComponents.MediumComponent">
<item name="cornerSize">8dp</item>
</style>
<style name="ShapeAppearance.DVS.LargeComponent" parent="ShapeAppearance.MaterialComponents.LargeComponent">
<item name="cornerSize">12dp</item>
</style>
...
<style name="Theme.DVS" parent="Theme.MaterialComponents.Light.NoActionBar">
...
<item name="shapeAppearanceSmallComponent">@style/ShapeAppearance.DVS.SmallComponent</item>
<item name="shapeAppearanceMediumComponent">@style/ShapeAppearance.DVS.MediumComponent</item>
<item name="shapeAppearanceLargeComponent">@style/ShapeAppearance.DVS.LargeComponent</item>
...
</style>
</resources>
These styles can be redefined in the custom theme or can be used in your application theme.
<resources xmlns:tools="http://schemas.android.com/tools">
...
<style name="ShapeAppearance.CustomDiveTheme.SmallComponent" parent="ShapeAppearance.DVS.SmallComponent">
<item name="cornerSize">12dp</item>
<item name="cornerFamily">cut</item>
</style>
...
<style name="Theme.CustomDiveTheme" parent="Theme.DVS">
<item name="shapeAppearanceSmallComponent">@style/ShapeAppearance.CustomDiveTheme.SmallComponent</item>
</style>
...
</resources>
DIVE SDK colors are based on Material Design colors. You can redefine them in the custom theme to adapt the UI to your branding.
<resources xmlns:tools="http://schemas.android.com/tools">
...
<style name="Theme.CustomDiveTheme" parent="Theme.DVS">
...
<item name="colorPrimary">#F500BC</item>
...
</style>
...
</resources>
Style of DIVE SDK buttons is based on Material Button and Outlined Material Button.
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<style name="Widget.DVS.MaterialButton" parent="Widget.MaterialComponents.Button">
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:insetLeft">0dp</item>
<item name="android:insetRight">0dp</item>
<item name="iconPadding">8dp</item>
<item name="iconSize">12dp</item>
<item name="android:textAllCaps">false</item>
</style>
<style name="Widget.DVS.OutlinedMaterialButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:insetLeft">0dp</item>
<item name="android:insetRight">0dp</item>
<item name="iconPadding">8dp</item>
<item name="iconSize">12dp</item>
<item name="android:textAllCaps">false</item>
<item name="android:textColor">?colorOnSurface</item>
<item name="iconTint">?colorOnSurface</item>
</style>
...
<style name="Theme.DVS" parent="Theme.MaterialComponents.Light.NoActionBar">
...
<item name="materialButtonStyle">@style/Widget.DVS.MaterialButton</item>
<item name="materialButtonOutlinedStyle">@style/Widget.DVS.OutlinedMaterialButton</item>
...
</style>
...
</resources>
You can redefine this styles in custom theme or use them in your application theme.
<resources xmlns:tools="http://schemas.android.com/tools">
...
<style name="Widget.CustomDiveTheme.MaterialButton" parent="Widget.DVS.MaterialButton">
<item name="android:textAllCaps">true</item>
<item name="android:textAppearance">?attr/textAppearanceSubtitle1</item>
</style>
<style name="Widget.CustomDiveTheme.OutlinedMaterialButton" parent="Widget.DVS.OutlinedMaterialButton">
<item name="android:textAllCaps">true</item>
<item name="android:textColor">?colorPrimary</item>
<item name="iconTint">?colorPrimary</item>
<item name="android:textAppearance">?attr/textAppearanceSubtitle1</item>
</style>
...
<style name="Theme.CustomDiveTheme" parent="Theme.DVS">
...
<item name="materialButtonStyle">@style/Widget.CustomDiveTheme.MaterialButton</item>
<item name="materialButtonOutlinedStyle">@style/Widget.CustomDiveTheme.OutlinedMaterialButton</item>
...
</style>
...
</resources>
The Style of the DIVE SDK Dialogs is based on MaterialAlertDialog
<resources>
<style name="Theme.DVS" parent="Theme.MaterialComponents.Light.NoActionBar">
...
<item name="dialogCornerRadius">8dp</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.DVS.AlertDialog</item>
<item name="dialogTheme">@style/ThemeOverlay.DVS.AlertDialog</item>
...
</style>
...
<style name="ThemeOverlay.DVS.AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
<item name="materialAlertDialogTitlePanelStyle">@style/Widget.DVS.AlertDialog.Title.Panel</item>
<item name="materialAlertDialogTitleTextStyle">@style/Widget.DVS.AlertDialog.Title.Text</item>
<item name="materialAlertDialogBodyTextStyle">@style/Widget.DVS.AlertDialog.Body.Text</item>
<item name="buttonBarPositiveButtonStyle">@style/Widget.DVS.AlertDialog.Button.Positive</item>
<item name="buttonBarNeutralButtonStyle">@style/Widget.DVS.AlertDialog.Button.Positive</item>
<item name="buttonBarNegativeButtonStyle">@style/Widget.DVS.AlertDialog.Button.Negative</item>
<item name="android:dividerHeight">1dp</item>
<item name="listDividerAlertDialog">@drawable/dvs_common_divider</item>
<item name="android:listDivider">@drawable/dvs_common_divider</item>
<item name="shapeAppearanceOverlay">@style/ShapeAppearance.DVS.Dialog</item>
<item name="listPreferredItemHeightSmall">48dp</item>
<item name="textAppearanceListItem">?textAppearanceBody1</item>
<item name="textAppearanceListItemSecondary">?textAppearanceBody1</item>
<item name="textAppearanceListItemSmall">?textAppearanceBody1</item>
</style>
...
<style name="Widget.DVS.Dialog.Title" parent="">
<item name="android:textAppearance">?textAppearanceHeadline4</item>
<item name="android:textColor">?colorOnPrimary</item>
<item name="android:background">?colorPrimary</item>
<item name="android:paddingLeft">16dp</item>
<item name="android:paddingRight">16dp</item>
<item name="android:paddingTop">24dp</item>
<item name="android:paddingBottom">24dp</item>
</style>
<style name="Widget.DVS.Dialog.Button" parent="Widget.MaterialComponents.Button.OutlinedButton">
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:insetRight">0dp</item>
<item name="android:insetLeft">0dp</item>
<item name="strokeWidth">0dp</item>
<item name="android:maxLines">1</item>
<item name="android:textAppearance">?textAppearanceButton</item>
</style>
<style name="Widget.DVS.Dialog.Button.Positive">
<item name="shapeAppearanceOverlay">@style/ShapeAppearance.DVS.Dialog.Button.Positive</item>
</style>
<style name="Widget.DVS.Dialog.Button.Negative">
<item name="shapeAppearanceOverlay">@style/ShapeAppearance.DVS.Dialog.Button.Negative</item>
</style>
<style name="Widget.DVS.AlertDialog.Title.Panel" parent="MaterialAlertDialog.MaterialComponents.Title.Panel">
<item name="android:background">@null</item>
<item name="android:paddingLeft">16dp</item>
<item name="android:paddingRight">16dp</item>
<item name="android:paddingTop">12dp</item>
<item name="android:paddingBottom">12dp</item>
</style>
<style name="Widget.DVS.AlertDialog.Title.Text" parent="MaterialAlertDialog.MaterialComponents.Title.Text">
<item name="android:textAppearance">?textAppearanceSubtitle1</item>
<item name="android:textColor">?colorOnSurface</item>
<item name="android:textStyle">bold</item>
</style>
<style name="Widget.DVS.AlertDialog.Body.Text" parent="">
<item name="android:textAppearance">?textAppearanceBody1</item>
<item name="android:textColor">?colorOnSurface</item>
</style>
<style name="Widget.DVS.AlertDialog.Button" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="shapeAppearance">@style/ShapeAppearance.DVS.SmallComponent</item>
<item name="android:textStyle">bold</item>
</style>
<style name="Widget.DVS.AlertDialog.Button.Positive">
<item name="android:textColor">?colorPrimary</item>
</style>
<style name="Widget.DVS.AlertDialog.Button.Negative">
<item name="android:textColor">?colorError</item>
</style>
</resources>
You can redefine these styles within the custom theme or use them in your application theme.
<resources xmlns:tools="http://schemas.android.com/tools">
...
<style name="Widget.CustomDiveTheme.AlertDialog.Title.Panel" parent="Widget.DVS.AlertDialog.Title.Panel">
<item name="android:background">?colorPrimary</item>
</style>
<style name="Widget.CustomDiveTheme.AlertDialog.Title.Text" parent="Widget.DVS.AlertDialog.Title.Text">
<item name="android:textAppearance">?textAppearanceHeadline3</item>
<item name="android:textColor">?colorOnPrimary</item>
</style>
<style name="Widget.CustomDiveTheme.AlertDialog.Body.Text" parent="Widget.DVS.AlertDialog.Body.Text">
<item name="android:textAppearance">?textAppearanceBody2</item>
<item name="android:textColor">?colorAccent</item>
</style>
<style name="ThemeOverlay.CustomDiveTheme.AlertDialog" parent="ThemeOverlay.DVS.AlertDialog">
<item name="materialAlertDialogTitlePanelStyle">@style/Widget.CustomDiveTheme.AlertDialog.Title.Panel</item>
<item name="materialAlertDialogTitleTextStyle">@style/Widget.CustomDiveTheme.AlertDialog.Title.Text</item>
<item name="materialAlertDialogBodyTextStyle">@style/Widget.CustomDiveTheme.AlertDialog.Body.Text</item>
</style>
...
<style name="Theme.CustomDiveTheme" parent="Theme.DVS">
...
<item name="dialogCornerRadius">16dp</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.CustomDiveTheme.AlertDialog</item>
<item name="dialogTheme">@style/ThemeOverlay.CustomDiveTheme.AlertDialog</item>
...
</style>
</resources>
- Title
- Background
- Subtitle
- List of document types
| Parameter | Expanded State | Collapsed State |
|---|---|---|
| Text Appearance | ?textAppearanceHeadline1 | ?textAppearanceSubtitle1 |
| Background | ?android:colorBackground | ?android:colorBackground |
| Parameter | Value |
|---|---|
| Background | ?android:windowBackground |
| Parameter | Value |
|---|---|
| Text Appearance | ?textAppearanceHeadline4 |
| Text Color | ?colorOnSurface |
| Parameter | Value |
|---|---|
| Background | ?colorSurface |
| Item Text Appearance | ?textAppearanceBody1 |
| Item Text Color | ?colorOnSurface |
- Title
- Background
- Subtitle
- Type Selector
- Step View
| Parameter | Expanded State | Collapsed State |
|---|---|---|
| Text Appearance | ?textAppearanceHeadline1 | ?textAppearanceSubtitle1 |
| Background | ?android:colorBackground | ?android:colorBackground |
| Parameter | Value |
|---|---|
| Background | ?android:windowBackground |
| Parameter | Value |
|---|---|
| Text Appearance | ?textAppearanceHeadline4 |
| Text Color | ?colorOnSurface |
| Parameter | Value |
|---|---|
| Text Appearance | ?textAppearanceBody1 |
| Text Color | ?colorOnSurface |
| Background | ?colorSurface |
| Parameter | Value |
|---|---|
| Step Title Text Appearance | ?textAppearanceBody1 |
| Step Title Text Color | ?colorPrimary |
| Step Description Text Appearance | ?textAppearanceHeadline5 |
| Step Description Text Color | ?colorOnSurface |
| Background | ?colorSurface |
- Source Selector
- Camera Scan Hint
- Manual Upload Title
- Manual Upload Subtitle
- Step Indicator
| Parameter | Active State | Inactive State |
|---|---|---|
| Text Appearance | ?textAppearanceBody1 | ?textAppearanceBody1 |
| Text Color | ?colorOnSurface | #59595F |
| Background | ?colorSurface | Transparent |
The style of the hint is defined by the ?dvsInstructionTextViewStyle theme attribute.
<style name="Theme.DVS">
...
<item name="dvsInstructionTextViewStyle">@style/Widget.DVS.TextView.Instruction</item>
...
</style>
The default value of this attribute is @style/Widget.DVS.TextView.Instruction that is defined as follows:
<style name="Widget.DVS.TextView.Instruction" parent="Widget.MaterialComponents.TextView">
<item name="android:textAlignment">center</item>
<item name="android:textAppearance">?textAppearanceHeadline4</item>
<item name="android:textColor">?colorOnPrimary</item>
</style>
<style name="Widget.DVS.TextView.Instruction" parent="Widget.MaterialComponents.TextView">
<item name="android:textAlignment">center</item>
<item name="android:textAppearance">?textAppearanceHeadline4</item>
<item name="android:textColor">?colorOnSurface</item>
</style>
| Parameter | Default | w720dp |
|---|---|---|
| Text Appearance | ?textAppearanceHeadline4 | ?textAppearanceHeadline4 |
| Text Color | ?colorOnPrimary | ?colorOnSurface |
| Parameter | Value |
|---|---|
| Text Appearance | ?textAppearanceSubtitle1 |
| Text Color | ?colorOnSurface |
| Parameter | Value |
|---|---|
| Text Appearance | ?textAppearanceCaption |
| Parameter | Active State | Inactive State | Completed State |
|---|---|---|---|
| Text Appearance | ?textAppearanceBody1 | ?textAppearanceBody1 | ?textAppearanceBody1 |
| Text Color | ?colorOnSurface | #FFB5B5B5 | ?colorAccent |
| Border Color | ?colorPrimary | @null | @null |
- Title
- Loading Indicator
| Parameter | Value |
|---|---|
| Text Appearance | ?textAppearanceHeadline1 |
| Parameter | Value |
|---|---|
| Indicator Color | ?colorPrimary |
| Indicator Track Color | #22000000 |
| Text Appearance | ?textAppearanceSubtitle1 |








