diff --git a/README.md b/README.md index d3b1a172..661f7e0f 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,8 @@ Once you start up the sample application, you'll be given the option of trying o ## General Requirements The minimum requirements for the SDK are: * Android 5.0 "Lollipop" (API level 21) or higher +* APG version 8.5 or higher +* Gradle version 8.7 or higher * Internet connection * Jumio KYX @@ -123,10 +125,6 @@ Before starting a session in our SDK, an SDK token has to be obtained. Please re Within the response of the [Account Creation or Account Update](https://docs.jumio.com/production/Content/Integration/Creating%20or%20Updatng%20Account/Creating%20or%20Updating%20Accounts.htm) API, a SDK token is returned, which needs to be applied to initiate the mobile SDK. -### Basic Authentication (Deprecated) -Previously, Basic Auth credentials were constructed using your API token as the User ID and your API secret as the password. You still can manage API token and secret in the Customer Portal under: -* __Settings > API credentials > API Users__ - ### Authentication with OAuth2 Your OAuth2 credentials are constructed using your API token as the Client ID and your API secret as the Client secret. You can view and manage your API token and secret in the Customer Portal under: * __Settings > API credentials > OAuth2 Clients__ diff --git a/docs/changelog.md b/docs/changelog.md index 281ad3a9..46b74681 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -16,16 +16,26 @@ All notable changes, such as SDK releases, updates and fixes, are documented in For detailed technical changes please refer to our [Transition Guide](transition_guide.md). ## Support Period -Current SDK version: __4.11.0__ +Current SDK version: __4.12.0__ Please refer to our [SDK maintenance and support policy](maintenance_policy.md) for more information about Mobile SDK maintenance and support. +## SDK Version: __4.12.0__ + +![Improvement] Added support for Jumio Liveness Premium with enhanced deepfake detection [Selfie Verification] + +![Improvement] Added support for Brazilian Digital Driver's License [ID Verification] + +![Fix] Multiple bug fixes and improvements + +![Change] Updated Android sample application UI, transitioning from XML-based layouts to using Jetpack Compose + ## SDK Version: __4.11.0__ ![Improvement] Added tilted image capture for frontside of ID documents. Enhanced checks of certain document security features [ID Verification] ![Improvement] Added unsupported documents check to improve quality of extracted data and improve user experience [ID Verification] -![Improvement] Added an updated Authentication Service [Identity Verification] +![Improvement] Added an updated Authentication Service [Selfie Verification] ![Fix] Fixed issues with code obfuscation @@ -34,7 +44,7 @@ Please refer to our [SDK maintenance and support policy](maintenance_policy.md) ![Improvement] Added flash capture for frontside of ID documents. Enhanced checks of certain document security features [ID Verification] -![Improvement] Support for Serbian language, for both Cyrillic and Latin [ID Verification, Identity Verification, Document Verification] +![Improvement] Support for Serbian language, for both Cyrillic and Latin [ID Verification, Selfie Verification, Document Verification] ## SDK Version: __4.9.1__ ![Fix] Fixed a rare issue that could lead to a crash when the SDK is recreated @@ -42,29 +52,29 @@ Please refer to our [SDK maintenance and support policy](maintenance_policy.md) ## SDK Version: __4.9.0__ ![Improvement] Automated document and country selection, powered by classifer ML model [ID Verification] -![Improvement] Added possibility to pre-load required ML models. For more information checkout the according section in the [README](../README.md#ml-models) [ID Verification, Identity Verification] +![Improvement] Added possibility to pre-load required ML models. For more information checkout the according section in the [README](../README.md#ml-models) [ID Verification, Selfie Verification] -![Improvement] Major UI Redesign [ID Verification, Identity Verification, Document Verification] +![Improvement] Major UI Redesign [ID Verification, Selfie Verification, Document Verification] -![Improvement] Improved Liveness retry logic. Prepared for granular instant feedback, if configured accordingly [Identity Verification] +![Improvement] Improved Liveness retry logic. Prepared for granular instant feedback, if configured accordingly [Selfie Verification] -![Improvement] iProov SDK version update to 9.0.3 [Identity Verification] +![Improvement] iProov SDK version update to 9.0.3 [Selfie Verification] ![Improvement] Added support for R8's `fullMode` for code shrinking and obfuscation -![Change] Removed Device Risk module from SDK [Identity Verification] +![Change] Removed Device Risk module from SDK [Selfie Verification] ## SDK Version: __4.8.2__ -![Improvement] iProov SDK version update to 8.5.2 [Identity Verification] +![Improvement] iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: __4.8.1__ ![Fix] Removed Location handling to fix potential Google Play Store rejections ## SDK Version: __4.8.0__ -![Improvement] Managing Liveness dependencies to help better conversion [Identity Verification] +![Improvement] Managing Liveness dependencies to help better conversion [Selfie Verification] ## SDK Version: __4.7.2__ -![Improvement] iProov SDK version update to 8.5.2 [Identity Verification] +![Improvement] iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: __4.7.1__ ![Fix] Removed Location handling to fix potential Google Play Store rejections @@ -74,39 +84,39 @@ Please refer to our [SDK maintenance and support policy](maintenance_policy.md) ![Improvement] Datadog SDK version update to 2.0: Added possibility to have a dedicated Jumio Datadog instance -![Improvement] Improved Jumio Liveness capturing experience [Identity Verification] +![Improvement] Improved Jumio Liveness capturing experience [Selfie Verification] -![Change] Updated Jumio Liveness module [Identity Verification] +![Change] Updated Jumio Liveness module [Selfie Verification] ![Change] Removed previous scanning functionalities, now all included in Autocapture functionality [ID Verification] ![Change] Removed Microblink barcode scanning, switched to MLkit [ID Verification] -![Fix] Fixed Liveness customization bug [Identity Verification] +![Fix] Fixed Liveness customization bug [Selfie Verification] ## SDK Version: __4.6.2__ -![Improvement] iProov SDK version update to 8.5.2 [Identity Verification] +![Improvement] iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: __4.6.1__ ![Fix] Removed Location handling to fix potential Google Play Store rejections ## SDK Version: __4.6.0__ -![Improvement] Added Jumio Liveness module to enhance the Liveness user experience and interface (Identity Verification) +![Improvement] Added Jumio Liveness module to enhance the Liveness user experience and interface (Selfie Verification) -![Improvement] Improved Liveness customization options (Identity Verification) +![Improvement] Improved Liveness customization options (Selfie Verification) ## SDK Version: __4.5.2__ -![Improvement] iProov SDK version update to 8.5.2 [Identity Verification] +![Improvement] iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: __4.5.1__ ![Fix] Removed Location handling to fix potential Google Play Store rejections ## SDK Version: __4.5.0__ -![Improvement] Added possibility for users to verify their identity using [Digital Identity](../README.md#digital-identity) [ID Verification, Identity Verification] +![Improvement] Added possibility for users to verify their identity using [Digital Identity](../README.md#digital-identity) [ID Verification, Selfie Verification] -![Improvement] iProov SDK version update to 8.3.1 [Identity Verification] +![Improvement] iProov SDK version update to 8.3.1 [Selfie Verification] -![Improvement] Improved user consent handling [ID Verification, Identity Verification] +![Improvement] Improved user consent handling [ID Verification, Selfie Verification]
More details @@ -127,7 +137,7 @@ User consent is now acquired for all users to ensure the accordance with biometr ![Improvement] Fully redesigned ID Autocapture experience - seamless capturing, precise guidance and faster user journey [ID Verification] -![Improvement] Major iProov SDK version update to 8.0.3 - no more face scanning filter, improved UI and more customization options [Identity Verification] +![Improvement] Major iProov SDK version update to 8.0.3 - no more face scanning filter, improved UI and more customization options [Selfie Verification] ![Improvement] Mandatory NFC scanning option [ID Verification] @@ -144,11 +154,11 @@ User consent is now acquired for all users to ensure the accordance with biometr ![Improvement] Improved user guidance: Clear distinction between scanning frontside or backside of ID document [ID Verification] -![Change] iProov SDK version update to 7.5.0 [Identity Verification] +![Change] iProov SDK version update to 7.5.0 [Selfie Verification] ![Change] The SDK's minSdkVersion has been increased to 21 (Lollipop). Please check the [Transition Guide](transition_guide.md) for details. -![Fix] UI bugs, internal crashes [Identity Verification] +![Fix] UI bugs, internal crashes [Selfie Verification] ## SDK Version: __4.2.1__ ![Fix] Removed Location handling to fix potential Google Play Store rejections @@ -156,11 +166,11 @@ User consent is now acquired for all users to ensure the accordance with biometr ## SDK Version: __4.2.0__ ![Improvement] Alignment of previously existing scanning method and improved user experience through addition of Autocapture module (Beta) [ID Verification] -![Improvement] Support for device fingerprint capability [ID Verification, Identity Verification] +![Improvement] Support for device fingerprint capability [ID Verification, Selfie Verification] ![Improvement] Addition of NFC image extraction for similarity check [ID Verification] -![Improvement] Improved liveness customization: Centered Floating prompt for better user guidance during face scanning [Identity Verification] +![Improvement] Improved liveness customization: Centered Floating prompt for better user guidance during face scanning [Selfie Verification] ![Fix] Bug fixes: UI bugs, internal crashes @@ -168,13 +178,13 @@ User consent is now acquired for all users to ensure the accordance with biometr ![Fix] Removed Location handling to fix potential Google Play Store rejections ## SDK Version: __4.1.0__ -![Improvement] Improved, granular user feedback for improved user experience and workflow through addition of Instant Feedback [ID Verification, Identity Verification] +![Improvement] Improved, granular user feedback for improved user experience and workflow through addition of Instant Feedback [ID Verification, Selfie Verification] -![Improvement] Support for Dark Mode for DefaultUI and CustomUI [ID Verification, Identity Verification] +![Improvement] Support for Dark Mode for DefaultUI and CustomUI [ID Verification, Selfie Verification] ![Improvement] Addition of optional Datadog diagnostics module for monitoring SDK behavior and performance, as well as more efficient troubleshooting -![Change] iProov SDK version update to 7.2.0 [Identity Verification] +![Change] iProov SDK version update to 7.2.0 [Selfie Verification] ![Fix] Bug fixes: UI bugs, security improvements, internal crashes @@ -195,46 +205,46 @@ This is a complete rewrite of our SDK. The SDK was built with CustomUI as a basi ![Fix] Removed Location handling to fix potential Google Play Store rejections ## SDK Version: __3.9.4__ -![Changes](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 6.4.3 [Identity Verification] +![Changes](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 6.4.3 [Selfie Verification] ## SDK Version: __3.9.3__ -![Changes](https://img.shields.io/badge/Improvement-green) Internal dependency update [Identity Verification] +![Changes](https://img.shields.io/badge/Improvement-green) Internal dependency update [Selfie Verification] ## SDK Version: __3.9.2__ -![Change] iProov SDK version update to 6.4.1, which improves performance and offers additional customization options [Identity Verification] +![Change] iProov SDK version update to 6.4.1, which improves performance and offers additional customization options [Selfie Verification] ## SDK Version: __3.9.1__ -![Change] iProov SDK version update to 6.3.1, which fixes cross-dependency problems with OkHttp 4.x versions [Identity Verification] +![Change] iProov SDK version update to 6.3.1, which fixes cross-dependency problems with OkHttp 4.x versions [Selfie Verification] -![Improvement] Improved customization options [Identity Verification] +![Improvement] Improved customization options [Selfie Verification] ## SDK Version: __3.9.0__ -![Improvement] Improved SDK lifecycle and state handling to reduce specific scenarios in which SDK crashes could have happened [Identity Verification] +![Improvement] Improved SDK lifecycle and state handling to reduce specific scenarios in which SDK crashes could have happened [Selfie Verification] -![Improvement] Improved retry guidance for Identity Verification [Identity Verification] +![Improvement] Improved retry guidance for Selfie Verification [Selfie Verification] -![Improvement] Improved customization options [Identity Verification] +![Improvement] Improved customization options [Selfie Verification] -![Improvement] Added more granular differentiations for `ScanMode` in CustomUI [Identity Verification] +![Improvement] Added more granular differentiations for `ScanMode` in CustomUI [Selfie Verification] -![Fix] Fixed rare issue that caused "Blur Hint" toast being displayed multiple times on certain devices [Identity Verification] +![Fix] Fixed rare issue that caused "Blur Hint" toast being displayed multiple times on certain devices [Selfie Verification] -![Fix] Fixed possible Camera Exception using CustomUI [ID Verification/Fastfill, Identity Verification, Authentication] +![Fix] Fixed possible Camera Exception using CustomUI [ID Verification/Fastfill, Selfie Verification, Authentication] -![Fix] Fixed possible app crash when calling `NetverifyCustomSDKController.retry()` [ID Verification/Fastfill, Identity Verification] +![Fix] Fixed possible app crash when calling `NetverifyCustomSDKController.retry()` [ID Verification/Fastfill, Selfie Verification] -![Fix] Fixed Zoom Authentication 412 error handling, preventing user from getting stuck in certain scenarios [Identity Verification] +![Fix] Fixed Zoom Authentication 412 error handling, preventing user from getting stuck in certain scenarios [Selfie Verification] -![Change] Removed deprecated Android Kotlin plugins [ID Verification/Fastfill, Identity Verification, Authentication, Document Verification] +![Change] Removed deprecated Android Kotlin plugins [ID Verification/Fastfill, Selfie Verification, Authentication, Document Verification] -![Change] iProov SDK version update to 6.3.0, which includes accuracy improvements using Liveness Assurance [Identity Verification] +![Change] iProov SDK version update to 6.3.0, which includes accuracy improvements using Liveness Assurance [Selfie Verification] ## SDK Version: __3.8.0__ ![Improvement] Added better guidance for devices with a fixed focal distance [ID Verification/Fastfill, Document Verification] ![Fix] Fixed crashes that could occur in edge cases [ID-Verification, Identity-Verification] -![Change] Added iProov as an additional liveness vendor to the [Jumio KYX platform](https://www.jumio.com/kyx/) [Identity Verification] +![Change] Added iProov as an additional liveness vendor to the [Jumio KYX platform](https://www.jumio.com/kyx/) [Selfie Verification] ## SDK Version: __3.7.3__ ![Improvement] New error code is returned in case an ad blocker or a firewall is detected [ID Verification/Fastfill, Authentication, Document Verification] diff --git a/docs/integration_faq.md b/docs/integration_faq.md index b5b61cf3..fe2b49b7 100644 --- a/docs/integration_faq.md +++ b/docs/integration_faq.md @@ -23,6 +23,7 @@ - [Overview of Scanning Methods](#overview-of-scanning-methods) - [Glossary of Commonly Used Abbreviations](#glossary) - [Google Play Store Prominent Disclosure](#google-play-store-prominent-disclosure) +- [Packaging Options](#packaging-options) - [Jumio Support](#jumio-support) ## User Consent @@ -74,7 +75,7 @@ In these cases the SDK will return a specific error code: __A10900__ If this err ## Reducing the Size of Your App The Jumio SDK contains a wide range of different scanning methods. The SDK is able to capture identity documents and extract information on the device using enhanced machine learning and computer vision technologies. -The current download size of the [sample application](../sample/JumioMobileSample/) containing all products is around **12.98 MB** as mentioned in the [ID Verification guide](integration_guide.md). +The current download size of the [sample application](../sample/JumioMobileSample/) containing all products is around **13.63 MB** as mentioned in the [ID Verification guide](integration_guide.md). If you want to reduce the size of the SDK within your application, there are several ways to achieve this: ### Strip Unused Modules @@ -84,17 +85,17 @@ The following table shows a range of different product configurations with the s | Product Configuration | Size | Modules | | :------------------------------------------- | :------: | :---------------------------------------------------------------------------------------------------: | -| Base | 1.27 MB | core | -| Base + iProov | 6.28 MB | core, iproov | -| Base + Autocapture | 2.82 MB | core, docfinder | -| Base + Autocapture, Barcode-Vision | 3.12 MB | core, docfinder, barcode-mlkit | -| Base + Autocapture, Barcode-Vision, iProov | 6.79 MB | core, docfinder, barcode, iproov | -| Base + Autocapture, Barcode-Vision, Liveness | 5.15 MB | core, docfinder, barcode, liveness | -| Base + Autocapture, Barcode-Vision, NFC | 6.24 MB | core, docfinder, barcode, nfc | -| All (Custom UI only) | 9.95 MB | core, docfinder, barcode-mlkit, iproov, nfc, digital-identity, camerax, liveness | -| Base + Autocapture, Default UI | 3.43 MB | core, docfinder, defaultui | -| Base + Autocapture, Default UI, Datadog | 4.11 MB | core, docfinder, defaultui, datadog | -| All (with Default UI) | 11.03 MB | core, docfinder, barcode-mlkit, iproov, nfc, digital-identtity, camerax, defaultui, datadog, liveness | +| Base | 1.13 MB | core | +| Base + iProov | 6.63 MB | core, iproov | +| Base + Autocapture | 2.75 MB | core, docfinder | +| Base + Autocapture, Barcode-Vision | 3.05 MB | core, docfinder, barcode-mlkit | +| Base + Autocapture, Barcode-Vision, iProov | 7.14 MB | core, docfinder, barcode, iproov | +| Base + Autocapture, Barcode-Vision, Liveness | 5.49 MB | core, docfinder, barcode, liveness | +| Base + Autocapture, Barcode-Vision, NFC | 6.24 MB | core, docfinder, barcode, nfc | +| All (Custom UI only) | 10.37 MB | core, docfinder, barcode-mlkit, iproov, nfc, digital-identity, camerax, liveness | +| Base + Autocapture, Default UI | 3.92 MB | core, docfinder, defaultui | +| Base + Autocapture, Default UI, Datadog | 4.60 MB | core, docfinder, defaultui, datadog | +| All (with Default UI) | 12.00 MB | core, docfinder, barcode-mlkit, iproov, nfc, digital-identtity, camerax, defaultui, datadog, liveness | __Note:__ The size values in the table above depict the decompressed install size required on a device and are comparable to the estimated Play Store files size. The size value might vary by a few percent, depending on the actual device used. All sizes are calculated based on a build of our sample application using arm64 architecture, english translations and xxhdpi screen resolution. @@ -227,7 +228,7 @@ Jumio SDK uses [Java 8 language.](https://developer.android.com/studio/write/jav ``` android { ... - compileOptions { + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } @@ -286,5 +287,31 @@ A [quick guide to commonly used abbreviations](integration_glossary.md) througho ## Google Play Store Prominent Disclosure Some parts of the SDK might require prominent disclosure - please see the [Privacy Notice](integration_guide.md#privacy-notice) section in the Integration Guide for further details +## Packaging Options +Multiple third party android libraries include the same meta files which will result in duplicates files during the build. +To get rid of them the following packagingOptions can be added to the build.gradle file: + +``` +android { +... + packagingOptions { + resources.excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF") + resources.excludes.add("META-INF/kotlin-project-structure-metadata.json") + resources.excludes.add("META-INF/kotlinx_coroutines_core.version") + resources.excludes.add("META-INF/LICENSE.md") + resources.excludes.add("META-INF/LICENSE-notice.md") + resources.excludes.add("commonMain/default/manifest") + resources.excludes.add("commonMain/default/linkdata/module") + resources.excludes.add("commonMain/default/linkdata/**/*.knm") + resources.excludes.add("nativeMain/default/manifest") + resources.excludes.add("nativeMain/default/linkdata/module") + resources.excludes.add("nativeMain/default/linkdata/**/*.knm") + resources.excludes.add("nonJvmMain/default/manifest") + resources.excludes.add("nonJvmMain/default/linkdata/module") + resources.excludes.add("nonJvmMain/default/linkdata/**/*.knm") + } +} +``` + ## Jumio Support The Jumio development team is constantly striving to optimize the size of our frameworks while increasing functionality, to improve your KYC and to fight fraud. If you have any further questions, please reach out to our [support team](mailto:support@jumio.com). diff --git a/docs/integration_guide.md b/docs/integration_guide.md index e23fdf33..5a2eb2ea 100644 --- a/docs/integration_guide.md +++ b/docs/integration_guide.md @@ -2,52 +2,52 @@ # Integration Guide for Android SDK -Jumio’s products allow businesses to establish the genuine identity of their users by verifying government-issued IDs in real-time. ID Verification, Identity Verification and other services are used by financial service organizations and other leading brands to create trust for safe onboarding, money transfers and user authentication. +Jumio’s products allow businesses to establish the genuine identity of their users by verifying government-issued IDs in real-time. ID Verification, Selfie Verification and other services are used by financial service organizations and other leading brands to create trust for safe onboarding, money transfers and user authentication. ## Table of Contents - [Release Notes](#release-notes) - [Code Documentation](#code-documentation) - [Setup](#setup) - - [Dependencies](#dependencies) - - [Autocapture](#autocapture) - - [Certified Face Liveness](#certified-face-liveness) - - [Barcode Scanning](#barcode-scanning) - - [NFC Scanning](#nfc-scanning) - - [SDK Version Check](#sdk-version-check) - - [Root Detection](#root-detection) - - [Device Supported Check](#device-supported-check) - - [Privacy Notice](#privacy-notice) - - [Digital Identity (DID)](#digital-identity--did-) - - [Risk Signal: Device Risk](#risk-signal--device-risk) + - [Dependencies](#dependencies) + - [Autocapture](#autocapture) + - [Certified Face Liveness](#certified-face-liveness) + - [Barcode Scanning](#barcode-scanning) + - [NFC Scanning](#nfc-scanning) + - [SDK Version Check](#sdk-version-check) + - [Root Detection](#root-detection) + - [Device Supported Check](#device-supported-check) + - [Privacy Notice](#privacy-notice) + - [Digital Identity (DID)](#digital-identity--did-) + - [Risk Signal: Device Risk](#risk-signal--device-risk) - [ML Models](#ml-models) - - [Bundling models in the app](#bundling-models-in-the-app) - - [Preloading models](#preloading-models) + - [Bundling models in the app](#bundling-models-in-the-app) + - [Preloading models](#preloading-models) - [Initialization](#initialization) - - [Requesting a Token (via OAuth2)](#requesting-a-token--via-oauth2-) - - [Initializing the Jumio SDK](#initializing-the-jumio-sdk) + - [Requesting a Token (via OAuth2)](#requesting-a-token--via-oauth2-) + - [Initializing the Jumio SDK](#initializing-the-jumio-sdk) - [Configuration](#configuration) - - [Worfklow Selection](#worfklow-selection) - - [Transaction Identifiers](#transaction-identifiers) - - [Preselection](#preselection) - - [Miscellaneous](#miscellaneous) + - [Worfklow Selection](#worfklow-selection) + - [Transaction Identifiers](#transaction-identifiers) + - [Preselection](#preselection) + - [Miscellaneous](#miscellaneous) - [SDK Workflow](#sdk-workflow) - - [Retrieving Information](#retrieving-information) + - [Retrieving Information](#retrieving-information) - [Default UI](#default-ui) - [Custom UI](#custom-ui) - - [Controller Handling](#controller-handling) - - [Credential Handling](#credential-handling) - - [ScanPart Handling](#scanpart-handling) - - [Result and Error Handling](#result-and-error-handling) - - [Instant Feedback](#instant-feedback) + - [Controller Handling](#controller-handling) + - [Credential Handling](#credential-handling) + - [ScanPart Handling](#scanpart-handling) + - [Result and Error Handling](#result-and-error-handling) + - [Instant Feedback](#instant-feedback) - [Customization](#customization) - - [Customization Tool](#customization-tool) - - [Default UI customization](#default-ui-customization) - - [Custom UI customization](#custom-ui-customization) + - [Customization Tool](#customization-tool) + - [Default UI customization](#default-ui-customization) + - [Custom UI customization](#custom-ui-customization) ## Release Notes -Please refer to our [Change Log](changelog.md) for more information. Current SDK version: **4.11.0** +Please refer to our [Change Log](changelog.md) for more information. Current SDK version: **4.12.0** For technical changes that should be considered when updating the SDK, please read our [Transition Guide](transition_guide.md). @@ -70,36 +70,36 @@ The [SDK Setup Tool](https://jumio.github.io/mobile-configuration-tool/out/) is Below you can find a list of dependencies that can be added to your application to enable different functionality of the Jumio SDK. Some modules are mandatory, others are optional. -If an optional module is **not linked**, some functionalities may not be available, but the library size will be reduced. The [Sample app](../sample/JumioMobileSample/) apk size is currently around **12.66 MB**. +If an optional module is **not linked**, some functionalities may not be available, but the library size will be reduced. The [Sample app](../sample/JumioMobileSample/) apk size is currently around **13.63 MB**. ```groovy // [Mandatory] Jumio Core library dependencies { - implementation "com.jumio.android:core:4.11.0" + implementation "com.jumio.android:core:4.12.0" ... } // [Optional] Extraction methods dependencies { - implementation "com.jumio.android:docfinder:4.11.0" // Autocapture library, includes all previous scanning methods - implementation "com.jumio.android:barcode-mlkit:4.11.0" // Barcode scanning library, assists Autocapture - implementation "com.jumio.android:nfc:4.11.0" // NFC scanning library, assists Autocapture - implementation "com.jumio.android:iproov:4.11.0" // Face Liveness library - implementation "com.jumio.android:liveness:4.11.0" // Face Liveness library - implementation "com.jumio.android:digital-identity:4.11.0" // Digital Identity verification library + implementation "com.jumio.android:docfinder:4.12.0" // Autocapture library, includes all previous scanning methods + implementation "com.jumio.android:barcode-mlkit:4.12.0" // Barcode scanning library, assists Autocapture + implementation "com.jumio.android:nfc:4.12.0" // NFC scanning library, assists Autocapture + implementation "com.jumio.android:iproov:4.12.0" // Face Liveness library + implementation "com.jumio.android:liveness:4.12.0" // Face Liveness library + implementation "com.jumio.android:digital-identity:4.12.0" // Digital Identity verification library ... } // [Optional] Jumio Default UI dependencies { - implementation "com.jumio.android:defaultui:4.11.0" + implementation "com.jumio.android:defaultui:4.12.0" ... } // [Optional] Additional functionality dependencies { - implementation "com.jumio.android:camerax:4.11.0" // CameraX library - implementation "com.jumio.android:datadog:4.11.0" // Analytics library + implementation "com.jumio.android:camerax:4.12.0" // CameraX library + implementation "com.jumio.android:datadog:4.12.0" // Analytics library ... } ``` @@ -116,14 +116,14 @@ Please note: `com.jumio.android:camerax` will be linked transitively when `com.j If necessary, the iProov SDK version can be overwritten with a more recent one: ```groovy -implementation "com.jumio.android:iproov:4.11.0" -implementation("com.iproov.sdk:iproov:9.1.1") { +implementation "com.jumio.android:iproov:4.12.0" +implementation("com.iproov.sdk:iproov:9.1.2") { exclude group: 'org.json', module: 'json' } ``` #### Barcode Scanning -In order to benefit from barcode scanning functionality included in the `com.jumio.android:docfinder` dependency, please add `com.jumio.android:barcode-mlkit` to your `build-gradle` file. +In order to benefit from barcode scanning functionality included in the `com.jumio.android:docfinder` dependency, please add `com.jumio.android:barcode-mlkit` to your `build-gradle` file. This dependency includes `com.google.android.gms:play-services-mlkit-barcode-scanning` library - if your application includes **other Google ML-kit libraries**, it might be necessary to override meta-data specified in the application tag of the `play-services-mlkit-barcode-scanning` manifest by [merging multiple manifests](https://developer.android.com/studio/build/manage-manifests#merge-manifests): @@ -135,7 +135,7 @@ This dependency includes `com.google.android.gms:play-services-mlkit-barcode-sca ``` #### NFC Scanning -In order to benefit from NFC scanning functionality included in the `com.jumio.android:docfinder` dependency, please add `com.jumio.android:nfc` to your `build-gradle` file. +In order to benefit from NFC scanning functionality included in the `com.jumio.android:docfinder` dependency, please add `com.jumio.android:nfc` to your `build-gradle` file. ### SDK Version Check @@ -166,7 +166,7 @@ Other stores might require something similar - please check before submitting yo Please see the [Jumio Privacy Policy for Online Services](https://www.jumio.com/legal-information/privacy-notices/jumio-corp-privacy-policy-for-online-services/) for further information. ### Digital Identity (DID) -In case Digital Identity verification has been enabled for your account you can add the `com.jumio.android:digital-identity` dependency to your application. This will enable you to make use of DID verification within the SDK. +In case Digital Identity Verification has been enabled for your account you can add the `com.jumio.android:digital-identity` dependency to your application. This will enable you to make use of DID verification within the SDK. Over the course of DID verification the SDK will launch an according third party application representing your Digital Identity. Communication between both applications (your integrating application and the Digital Identity application) is done via a so-called "deep link". For more information on deep link handling on Android please check out their [official guide](https://developer.android.com/training/app-links). @@ -331,7 +331,7 @@ Use the correct [workflow definition key](https://docs.jumio.com/production/Cont For more details, please refer to our [Workflow Description Guide](https://support.jumio.com/hc/en-us/articles/4408958923803-KYX-Workflows-User-Guide). -ℹ️  **Note:** Identity Verification requires portrait orientation in your app. +ℹ️  **Note:** Selfie Verification requires portrait orientation in your app. ### Transaction Identifiers @@ -409,59 +409,62 @@ The following tables give information on the specification of all data parameter #### Class **_JumioIDResult_** -| Parameter | Type | Max. length | Description | -|:-----------------| :------------- | :---------- |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| issuingCountry | String | 3 | Country of issue as [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code | -| idType | String | | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA as provided or selected | -| idSubType | String | | Sub type of the scanned ID | -| firstName | String | 100 | First name of the customer | -| lastName | String | 100 | Last name of the customer | -| dateOfBirth | String | | Date of birth | -| issuingDate | String | | Date of issue | -| expiryDate | String | | Date of expiry | -| documentNumber | String | 100 | Identification number of the document | -| personalNumber | String | | Personal number of the document | -| gender | String | | Gender M, F or X | -| nationality | String | | Nationality of the customer | -| placeOfBirth | String | 255 | Place of birth | -| country | String | | Country of residence | -| address | String | 64 | Street name of residence | -| city | String | 64 | City of residence | -| subdivision | String | 3 | Last three characters of [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US) or [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA) subdivision code | -| postalCode | String | 15 | Postal code of residence | -| mrzLine1 | String | 50 | MRZ line 1 | -| mrzLine2 | String | 50 | MRZ line 2 | -| mrzLine3 | String | 50 | MRZ line 3 | -| extractionMethod | JumioScanMode | | Extraction method used during scanning (MRZ, BARCODE, MANUAL, OCR_CARD, NFC) | -| imageData | JumioImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | +| Parameter | Type | Max. length | Description | +|:-----------------|:-----------------------------| :---------- |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| issuingCountry | String | 3 | Country of issue as [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code | +| idType | String | | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA as provided or selected | +| idSubType | String | | Sub type of the scanned ID | +| firstName | String | 100 | First name of the customer | +| lastName | String | 100 | Last name of the customer | +| dateOfBirth | String | | Date of birth | +| issuingDate | String | | Date of issue | +| expiryDate | String | | Date of expiry | +| documentNumber | String | 100 | Identification number of the document | +| personalNumber | String | | Personal number of the document | +| gender | String | | Gender M, F or X | +| nationality | String | | Nationality of the customer | +| placeOfBirth | String | 255 | Place of birth | +| country | String | | Country of residence | +| address | String | 64 | Street name of residence | +| city | String | 64 | City of residence | +| subdivision | String | 3 | Last three characters of [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US) or [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA) subdivision code | +| postalCode | String | 15 | Postal code of residence | +| mrzLine1 | String | 50 | MRZ line 1 | +| mrzLine2 | String | 50 | MRZ line 2 | +| mrzLine3 | String | 50 | MRZ line 3 | +| curp | String | | The Clave Única de Registro de Población (CURP) identity code for Mexican documents. | +| extractionMethod | JumioScanMode[jumioscanmode] | | Extraction method used during scanning | +| imageData | JumioImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | #### Class **_JumioFaceResult_** -| Parameter | Type | Max. length | Description | -| :--------------- | :------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | -| passed | Boolean | | -| extractionMethod | JumioScanMode | | Extraction method used during scanning (FACE_MANUAL, FACE_IPROOV) | -| imageData | JumioImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | +| Parameter | Type | Max. length | Description | +| :--------------- |:-----------------------------| :---------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------| +| passed | Boolean | | +| extractionMethod | JumioScanMode[jumioscanmode] | | Extraction method used during scanning (FACE_MANUAL, FACE_IPROOV, JUMIO_LIVENESS) | +| imageData | JumioImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | #### Class **_JumioRejectReason_** -List of all possible reject reasons returned if Instant Feedback is used: - -| Code | Message | Description | Check enabled server-side (2022-05-25) | -|:-----|:---------------------|:---------------------------------------------------|:--------------------------------------:| -| 102 | BLACK_WHITE_COPY | Document appears to be a black and white photocopy | x | -| 103 | COLOR_PHOTOCOPY | Document appears to be a colored photocopy | | -| 104 | DIGITAL_COPY | Document appears to be a digital copy | x | -| 200 | NOT_READABLE | Document is not readable | | -| 201 | NO_DOC | No document could be detected | x | -| 206 | MISSING_BACK | Backside of the document is missing | x | -| 214 | MISSING_FRONT | Frontside of the document is missing | x | -| 401 | UNSUPPORTED_DOCUMENT | Document is not supported | x | -| 2001 | BLURRY | Document image is unusable because it is blurry | x | -| 2003 | MISSING_PART_DOC | Part of the document is missing | x | -| 2004 | HIDDEN_PART_DOC | Part of the document is hidden | | -| 2005 | DAMAGED_DOCUMENT | Document appears to be damaged | | -| 2006 | GLARE | Document image is unusable because of glare | x | +List of all possible **_reject reasons_** the SDK could return if Instant Feedback is used: +⚠️  **Note:** Please be aware that the list of reject reasons that get returned depends on server-side configuration for every individual merchant. + +| Code | Message | Description | +|:-----|:---------------------|:---------------------------------------------------| +| 102 | BLACK_WHITE_COPY | Document appears to be a black and white photocopy | +| 103 | COLOR_PHOTOCOPY | Document appears to be a colored photocopy | +| 104 | DIGITAL_COPY | Document appears to be a digital copy | +| 200 | NOT_READABLE | Document is not readable | +| 201 | NO_DOC | No document could be detected | +| 206 | MISSING_BACK | Backside of the document is missing | +| 214 | MISSING_FRONT | Frontside of the document is missing | +| 401 | UNSUPPORTED_DOCUMENT | Document is not supported | +| 501 | INVALID_CERTIFICATE | Document certificate could not be validated | +| 2001 | BLURRY | Document image is unusable because it is blurry | +| 2003 | MISSING_PART_DOC | Part of the document is missing | +| 2004 | HIDDEN_PART_DOC | Part of the document is hidden | +| 2005 | DAMAGED_DOCUMENT | Document appears to be damaged | +| 2006 | GLARE | Document image is unusable because of glare | #### Error Codes @@ -503,7 +506,7 @@ The following sequence diagram outlines components, callbacks and methods for a ![Custom UI Happy Path Diagram](images/happy_paths/custom_ui_happy_path_diagram.png) -⚠️  **Note:** The new 3D face liveness capturing technology is not optimized for tablets. When using Identity Verification, the face scanner will fallback to a simple face capturing functionality instead. Portrait orientation support is required in your app. +⚠️  **Note:** The new 3D face liveness capturing technology is not optimized for tablets. When using Selfie Verification, the face scanner will fallback to a simple face capturing functionality instead. Portrait orientation support is required in your app. CustomUI enables you to use a custom scan view with a plain scanning user interface. Initialize the Jumio SDK and set [`token`][token] and [`datacenter`][datacenter]. @@ -549,7 +552,7 @@ The user can open and continue to the provided consent link if they choose to do Obtain an instance of [`JumioCredential`][jumiocredential] which will contain all necessary information about the verification process by calling `start` on the `JumioController`. -For ID verification you will receive a [`JumioIDCredential`][jumioidcredential], for Identity Verification a [`JumioFaceCredential`][jumiofacecredential], and so on. Call [`isConfigured`][isconfigured] to check if the credential is already pre-configured. If so, it can be started right away. +For ID verification you will receive a [`JumioIDCredential`][jumioidcredential], for Selfie Verification a [`JumioFaceCredential`][jumiofacecredential], and so on. Call [`isConfigured`][isconfigured] to check if the credential is already pre-configured. If so, it can be started right away. ```kotlin val currentCredentialInfo = ... @@ -562,7 +565,7 @@ if (currentCredential?.isConfigured == true) { If the credential is not configured yet, it needs some more configuration before scan parts can be initialized. Details on how to configure each credential and retrieve the first [scan part][jumioscanpart] can be found below. -- [`JumioCredentialCategory`][jumiocredentialcategory] values = `ID`, `FACE`, `DOCUMENT`, `DATA` +- [`JumioCredentialCategory`][jumiocredentialcategory] values: `ID`, `FACE`, `DOCUMENT`, `DATA` #### Jumio ID Credential @@ -601,9 +604,9 @@ idCredential.setConfiguration(country, document) - [`JumioPhysicalDocument`][jumiophysicaldocument] represents a single `JumioDocumentType` and `JumioDocumentVariant` combination - - [`JumioDocumentType`][jumiodocumenttype] values: `PASSPORT`, `VISA`, `DRIVING_LICENSE`, `ID_CARD` + - [`JumioDocumentType`][jumiodocumenttype] values: `PASSPORT`, `VISA`, `DRIVING_LICENSE`, `ID_CARD` - - [`JumioDocumentVariant`][jumiodocumentvariant] values: `PAPER`, `PLASTIC` + - [`JumioDocumentVariant`][jumiodocumentvariant] values: `PAPER`, `PLASTIC` - [`JumioDigitalDocument`][jumiodigitaldocument] represents a digital document ("Digital Identity") @@ -616,7 +619,7 @@ idCredential.initScanPart(credentialPart, yourScanPartInterface) #### Jumio Face Credential -In case of [`JumioFaceCredential`][jumiofacecredential], depending of the configuration the SDK uses the Certified Liveness technology from iProov to determine liveness or the manual face detection. The mode can be detected by checking the [`JumioScanMode`][jumioscanmode] of the [`JumioScanPart`][jumioscanpart]. Make sure to also implement `FACE_MANUAL` as a fallback, in case `FACE_IPROOV` is not available. +In case of [`JumioFaceCredential`][jumiofacecredential], Jumio uses Certified Liveness technology to determine liveness. The mode can be detected by checking the [`JumioScanMode`][jumioscanmode] of the [`JumioScanPart`][jumioscanpart]. Make sure to also implement `FACE_MANUAL` as a fallback, in case `JUMIO_LIVENESS` or `FACE_IPROOV` is not available. Retrieve the credential part of the credential to start the scanning process by calling: @@ -745,7 +748,18 @@ Start the scanning process by initializing the [`JumioScanPart`][jumioscanpart]. `currentScanPart = currentCredential?.initScanPart(credentialPart, yourJumioScanPartInterface)` -- [`JumioCredentialPart`][jumiocredentialpart] values: `FRONT`, `BACK`, `MULTIPART`, `FACE`, `DOCUMENT`, `NFC` +- [`JumioCredentialPart`][jumiocredentialpart] values: `FRONT`, `BACK`, `MULTIPART`, `FACE`, `DOCUMENT`, `NFC`, `DIGITAL` + +Each [`jumioScanPart`][jumioScanPart] has an associated `scanMode`. Depending on the scan mode, you need to provide a different user guidance. The following scan modes are available for the different `JumioCredentialPart`s: + +* [`JumioScanMode`][jumioScanMode] values: + * `FRONT`, `BACK`, `MULTIPART`: `MANUAL`, `BARCODE`, `DOCFINDER` + * `DIGITAL`: `WEB`, `FILE` + * `NFC`: `NFC` + * `FACE`: `FACE_MANUAL`, `FACE_IPROOV`, `JUMIO_LIVENESS`, `JUMIO_PREMIUM` + * `DOCUMENT`: `MANUAL`, `FILE` + +During the scanning process, use the `onUpdate` function of the `JumioScanPartInterface` to check on the scanning progress and update your user guidance accordingly. `MULTIPART` handles the scanning of multiple sides in one seamless capture experience. When a [`MULTIPART`][jumiomultipart] scan part is started, an additional [`NEXT_PART`][nextpart] step is sent after [`IMAGE_TAKEN`][imagetaken]. This signals that another side of the document should be scanned now. The step returns the [`JumioCredentialPart`][jumiocredentialpart] that should be scanned next. We suggest to actively guide the user to move to the next part, e.g. by showing an animation and by disabling the extraction during the animation. Please also check the new [`NEXT_PART`][nextpart] scan step for this [`JumioCredentialPart`][jumiocredentialpart] @@ -766,11 +780,11 @@ override fun onFinished(result: JumioResult) { } ``` -#### Scan steps +#### Scan Steps During the scanning process [`onScanStep()`][onscanstep] will be called as soon as the [`JumioScanPart`][jumioscanpart] needs additional input to continue the scanning journey. The provided [`JumioScanStep`][jumioscanstep] indicates what needs to be done next. -[`JumioScanStep`][jumioscanstep] covers lifecycle events which require action from the customer to continue the process. +[`JumioScanStep`][jumioscanstep]s cover lifecycle events which require action from the customer to continue the process. [`JumioScanStep`][jumioscanstep] values: `PREPARE`, `STARTED`, `ATTACH_ACTIVITY`, `ATTACH_FILE`, `SCAN_VIEW`, `NEXT_PART`, `IMAGE_TAKEN`, `PROCESSING`, `CONFIRMATION_VIEW`, `REJECT_VIEW`, `RETRY`, `CAN_FINISH`, `ADDON_SCAN_PART`, `DIGITAL_IDENTITY_VIEW`, `THIRD_PARTY_VERIFICATION` @@ -790,6 +804,24 @@ JumioScanStep.STARTED -> { } ``` +[`DIGITAL_IDENTITY_VIEW`][digitalidentityview] points out that the current [`JumioScanPart`][jumioscanpart] needs to be attached to a [`JumioDigitalIdentityView`][jumiodiview]. The [`JumioDigitalIdentityView`][jumiodiview] is a custom view that can be placed in your layout. + +```kotlin +JumioScanStep.DIGITAL_IDENTITY_VIEW -> { + currentScanPart?.let { + jumioDigitalIdentityView.attach(it) + } +} +``` + +[`THIRD_PARTY_VERIFICATION`][thirdpartyverification] is triggered in case the current [`JumioScanPart`][jumioscanpart] will switch to a third party's application to continue the verification process (e.g. for Digital Identity verification). As this might take some time, showing a loading indicator is recommended. + +```kotlin +JumioScanStep.THIRD_PARTY_VERIFICATION -> { + showLoadingView() +} +``` + [`ATTACH_ACTIVITY`][attachactivity] indicates that an Activity Context is needed. Please see [`JumioActivityAttacher`][jumioactivityattacher] for more information. ```kotlin @@ -800,7 +832,8 @@ JumioScanStep.ATTACH_ACTIVITY -> { } ``` -[`ATTACH_FILE`][attachfile] is called when a File through the [`JumioFileAttacher`][jumiofileattacher] can be added to the [`JumioScanPart`][jumioscanpart]. +[`ATTACH_FILE`][attachfile] is sent when the user needs to select and upload a file. For this, you should create a [`JumioFileAttacher`][jumiofileattacher], add it to your [`JumioScanPart`][jumioscanpart] and provide the document. +This step is only sent, when the scan method is `FILE`. ```kotlin JumioScanStep.ATTACH_FILE -> { @@ -814,7 +847,9 @@ JumioScanStep.ATTACH_FILE -> { } ``` -[`SCAN_VIEW`][scanview] points out that a [`JumioScanView`][jumioscanview] needs to be attached to the [`JumioScanPart`][jumioscanpart]. The [`JumioScanView`][jumioscanview] is a custom view that can be placed in your layout. During runtime it just needs to be attached to the [`JumioScanPart`][jumioscanpart]. Make sure to re-attach the scanview from scan steps [`STARTED`][started] or [`NEXT_PART`][nextpart] in case the activity gets recreated and the scanview was attached before. +[`SCAN_VIEW`][scanview] is sent, when the scan view should be displayed. On this view, the user will capture a photo or a sequence of photos of a document or of a face with the camera. +[`JumioScanView`][jumioscanview] needs to be attached to the [`JumioScanPart`][jumioscanpart]. The [`JumioScanView`][jumioscanview] is a custom view that can be placed in your layout. +During runtime it just needs to be attached to the [`JumioScanPart`][jumioscanpart]. Make sure to re-attach the scanview from scan steps [`STARTED`][started] or [`NEXT_PART`][nextpart] in case the activity gets recreated and the scanview was attached before. ```kotlin JumioScanStep.SCAN_VIEW -> { @@ -832,22 +867,22 @@ If images for confirmation or rejection need to be displayed then [`JumioScanSte ```kotlin JumioScanStep.CONFIRMATION_VIEW -> { - val confirmationHandler = ConfirmationHandler() + val confirmationHandler = ConfirmationHandler() confirmationHandler.attach(scanPart) confirmationHandler.parts.forEach { - val confirmationView = JumioConfirmationView(context) - confirmationHandler.renderPart(it, confirmationView) - ... - } + val confirmationView = JumioConfirmationView(context) + confirmationHandler.renderPart(it, confirmationView) + ... + } } JumioScanStep.REJECT_VIEW -> { - val rejectHandler = RejectHandler() - rejectHandler.attach(scanPart) - rejectHandler.parts.forEach { - val rejectView = JumioRejectView(context) - rejectHandler.renderPart(it, rejectView) - ... - } + val rejectHandler = RejectHandler() + rejectHandler.attach(scanPart) + rejectHandler.parts.forEach { + val rejectView = JumioRejectView(context) + rejectHandler.renderPart(it, rejectView) + ... + } } ``` @@ -869,38 +904,40 @@ JumioScanStep.RETRY -> { For possible retry codes please checkout [`JumioRetryReasonGeneric`][jumioretrygeneric], [`JumioRetryReasonDocumentVerification`][jumioretrydv], [`JumioRetryReasonNfc`][jumioretrynfc], [`JumioRetryReasonIproov`][jumioretryiproov] and [`JumioRetryReasonDigitalIdentity`][jumioretrydi]. -[`DIGITAL_IDENTITY_VIEW`][digitalidentityview] points out that the current [`JumioScanPart`][jumioscanpart] needs to be attached to a [`JumioDigitalIdentityView`][jumiodiview]. The [`JumioDigitalIdentityView`][jumiodiview] is a custom view that can be placed in your layout. +As soon as the scan part has been confirmed and all processing has been completed [`CAN_FINISH`][canfinish] is triggered. [`scanPart.finish()`][finishscanpart] can now be called. During the finish routine the SDK checks if there is an add-on functionality for this part available, e.g. possible NFC scanning after an MRZ scan part. In this case [`ADDON_SCAN_PART`][addonscanpart] will be called. -```kotlin -JumioScanStep.DIGITAL_IDENTITY_VIEW -> { - currentScanPart?.let { - jumioDigitalIdentityView.attach(it) - } -} -``` +When an add-on to the current scan part is available, [`JumioScanStep.ADDON_SCAN_PART`][addonscanpart] is sent. The add-on scan part can be retrieved using the method `addonScanPart = currentCredential?.getAddonPart()`. -[`THIRD_PARTY_VERIFICATION`][thirdpartyverification] is triggered in case the current [`JumioScanPart`][jumioscanpart] will switch to a third party's application to continue the verification process (e.g. for Digital Identity verification). As this might take some time, showing a loading indicator is recommended. +To see if the finished credential part was the last one of the credential, check `currentCredentialPart == currentCredential?.credentialPart?.last()`. Check if the credential is complete by calling [`currentCredential?.isComplete`][isComplete] and finish the current credential by calling [`currentCredential?.finish()`][credentialFinish]. -```kotlin -JumioScanStep.THIRD_PARTY_VERIFICATION -> { - showLoadingView() -} -``` +Continue that procedure until all necessary credentials (e.g. `ID`, `FACE`, `DOCUMENT`, `DATA`) are finished. Check if the last credential is finished, then call [`controller?.finish()`][controllerFinish] to end the user journey. + +#### Scan Updates -As soon as the scan part has been confirmed and all processing has been completed [`CAN_FINISH`][canfinish] is triggered. [`scanPart.finish()`][finishscanpart] can now be called. During the finish routine the SDK checks if there is an add-on functionality for this part available, e.g. possible NFC scanning after an MRZ scan part. In this case [`ADDON_SCAN_PART`][addonscanpart] will be called +[`JumioScanUpdates`][jumioscanupdate]s are distributed via the `JumioScanPartInterface` method [`onUpdate()`][onupdate] and cover scan information that is relevant and might need to be displayed during scanning process. +An optional value `data` of type `Any` can contain additional information for each scan update as described. -When an add-on to the current scan part is available, [`JumioScanStep.ADDON_SCAN_PART`][addonscanpart] is sent. The add-on scan part can be retrieved using the method `addonScanPart = currentCredential?.getAddonPart()`. +[`JumioScanUpdate`][jumioscanupdate] values: `CAMERA_AVAILABLE`, `FALLBACK`, `NFC_EXTRACTION_STARTED`, `NFC_EXTRACTION_PROGRESS`, `NFC_EXTRACTION_FINISHED`, `CENTER_ID`, `HOLD_STRAIGHT`, `MOVE_CLOSER`, `TOO_CLOSE`, `HOLD_STILL`, `MOVE_FACE_CLOSER`, `FACE_TOO_CLOSE`, `NEXT_POSITION`, `FLASH`, `TILT` -#### Scan Updates +In case of `FALLBACK`, the `scanMode` has changed and you should adapt the user interface to reflect the new scan mode. Check the `JumioScanView`[jumioscanview] method `isShutterEnabled`[isshutterenabled] and see if it returns `true`. +If this is the case, a manual shutter button needs to be displayed for the end user to capture an image. -Apart from the scan steps, there are also scan updates distributed via the `scanPart` method [`onUpdate()`][onupdate]. They cover additional scan information that is relevant and might need to be displayed during scanning. The parameters are [`JumioScanUpdate`][jumioscanupdate] and an optional value `data` of type `Any` that can contain additional information for each scan update as described. +All possible [`JumioFallbackReason`][fallbackreason] values are sent in the optional `data` value to indicate the reason of the fallback. -[`JumioScanUpdate`][jumioscanupdate] values: `CAMERA_AVAILABLE`, `FALLBACK`, `NFC_EXTRACTION_STARTED`, `NFC_EXTRACTION_PROGRESS`, `NFC_EXTRACTION_FINISHED`, `CENTER_ID`, `HOLD_STRAIGHT`, `MOVE_CLOSER`, `TOO_CLOSE`, `HOLD_STILL`, `MOVE_FACE_CLOSER`, `FACE_TOO_CLOSE`, `FLASH`, `TILT` +`NFC_EXTRACTION_STARTED`, `NFC_EXTRACTION_PROGRESS`, and `NFC_EXTRACTION_FINISHED` make it possible to track the progress of an NFC scan. `NFC_EXTRACTION_PROGRESS` additionally delivers an integer in the data parameter in the range of 0-100 to signal the progress in the current data group. -For `FALLBACK`, there are 2 possible [`JumioFallbackReason`][fallbackreason]'s sent in the optional `data` value to indicate the reason of the fallback. -The scan update `FLASH` indicates that the camera's flash should be turned `ON` or `OFF`. The according [`JumioFlashState`][jumioflashstate] is transmitted via the `data` parameter. -In case the scan update `TILT` is received, this means that the document in front of the camera needs to be tilted. The current angle as well as the target angle are transmitted as [`JumioTiltState`][jumiotiltstate] via the `data` parameter. -A negative current angle indicates that the document needs to be tilted in the other direction! +`NEXT_POSITION` signals that the user needs to take a second image, e.g., needs to move the face in a liveness scan. + +For the scanMode `DOCFINDER`, the following scan updates are sent: `CENTER_ID`, `TOO_CLOSE`, `MOVE_CLOSER`, `HOLD_STRAIGHT`, `TILT`, `FLASH` + +FOR `ID` scans, a Long representing the time for which the user needs to hold still is sent in the data parameter of `JumioScanPartInterface.onUpdate`, when the extraction state `HOLD_STILL` is returned. + +`TILT` signals that during an `ID` scan, the document in front of the camera needs to be tilted. The current angle as well as the target angle are transmitted as [`JumioTiltState`][jumiotiltstate] via the `data` parameter. +A negative current angle indicates that the document needs to be tilted in the other direction. When a tilt update is sent, advise the user to tilt the identity document by e.g. showing an animation or an overlay. + +`FLASH` signals the enabling or disabling of the camera flash. + +We send the following extraction states for the scan modes `JUMIO_LIVENESS` and `JUMIO_PREMIUM`: `CENTER_FACE`, `FACE_TOO_CLOSE`, `MOVE_FACE_CLOSER`, `MOVE_FACE_INTO_FRAME`, `LEVEL_EYES_AND_DEVICE`, `HOLD_STILL`, `TILT_FACE_UP`, `TILT_FACE_DOWN`, `TILT_FACE_LEFT`, `TILT_FACE_RIGHT` ```kotlin override fun onUpdate(jumioScanUpdate: JumioScanUpdate, data: Any?) { @@ -908,7 +945,7 @@ override fun onUpdate(jumioScanUpdate: JumioScanUpdate, data: Any?) { JumioScanUpdate.FALLBACK -> handleFallback(data as JumioFallbackReason) JumioScanUpdate.FLASH -> handleFlash(data as JumioFlashState) JumioScanUpdate.TILT -> handleTilt(data as JumioTiltState) - ... // handle other scan updates + ... // handle other scan updates } } ``` @@ -935,7 +972,7 @@ override fun onError(error: JumioError) { // retry scan attempt } else { // handle error case - } + } log(String.format("onError: %s, %s, %s", error.code, error.message, if (error.isRetryable) "true" else "false")) } ``` @@ -966,8 +1003,8 @@ Apply your custom theme that you defined before by replacing `Theme.Jumio` in th ```xml + android:name="com.jumio.defaultui.JumioAcitivty" + android:theme="@style/AppThemeCustomJumio"> ... ``` @@ -1024,6 +1061,7 @@ In any case, your use of this Software is subject to the terms and conditions th [finishscanpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/finish.html [finishcredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/finish.html [finishcontroller]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/finish.html +[isshutterenabled]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-scan-view/is-shutter-enabled.html [isretryable]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.error/-jumio-error/is-retryable.html [confirm]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/confirm.html [retakeconfirmation]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/retake.html diff --git a/docs/maintenance_policy.md b/docs/maintenance_policy.md index 181546cb..fb47b9d6 100644 --- a/docs/maintenance_policy.md +++ b/docs/maintenance_policy.md @@ -38,6 +38,7 @@ The following table is a visual representation of the SDK 4.x.x version life-cyc | Version | Release | End of Support | End of Life | |:-------:|:-----------------:|:-----------------:|:-----------------:| +| 4.12.0 | 6 December 2024 | 6 September 2025 | 6 December 2026 | | 4.11.0 | 20 August 2024 | 20 May 2025 | 20 August 2026 | | 4.10.0 | 5 June 2024 | 5 March 2025 | 5 June 2026 | | 4.9.1 | 3 April 2024 | 21 November 2024 | 21 February 2026 | diff --git a/docs/transition_guide.md b/docs/transition_guide.md index c1c54fc2..7bc64821 100644 --- a/docs/transition_guide.md +++ b/docs/transition_guide.md @@ -6,6 +6,71 @@ This section covers all technical changes that should be considered when updatin ⚠️  When updating your SDK version, __all__ changes/updates made in in the meantime have to be taken into account and applied if necessary. __Example:__ If you're updating from SDK version __3.7.2__ to __3.9.2__, the changes outlined in __3.8.0, 3.9.0__ and __3.9.1__ are __still relevant__. +## 4.12.0 +This version adds support for Android 15 and 16KB page size for native libraries. + +#### Public API Changes +* Property `LINEFINDER` was unused and has been removed from [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) +* Property `JUMIO_PREMIUM` has been added to [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) +* Optional parameter `url` has been added to [`JumioDigitalDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document/index.html) +* `INVALID_CERTIFICATE` has been added to [`JumioRejectReason`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.reject/-jumio-reject-reason/index.html) +* Function `detach()` has been added to [`JumioScanView`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-scan-view/index.html) + +#### Dependency Updates +* Tensorflow Lite dependencies have been updated to LiteRT - see https://developers.googleblog.com/en/tensorflow-lite-is-now-litert/ for more infos. + +| Name | Jumio Module | Dependency | old version | new version | +|--------------------------|---------------------|-----------------------------------------------------------------|-------------|-------------| +| Android Gradle Plugin | all | `"com.android.library"` | 8.2.2 | 8.6.1 | +| Kotlin Plugin | all | `"org.jetbrains.kotlin.android"` | 1.9.24 | 2.0.0 | +| Kotlin Stdlib | all | `"org.jetbrains.kotlin:kotlin-stdlib-jdk8"` | 1.9.24 | 2.0.0 | +| Annotation | core | `"androidx.annotation:annotation-jvm"` | 1.8.0 | 1.8.2 | +| Navigation UI | core | `"androidx.navigation:navigation-ui-ktx"` | 2.7.7 | 2.8.1 | +| Navigation Fragment | core | `"androidx.navigation:navigation-fragment-ktx"` | 2.7.7 | 2.8.1 | +| LibYUV | core | `"io.github.crow-misia.libyuv:libyuv-android"` | 0.34.0 | 0.36.0 | +| CameraX Core | camerax | `"androidx.camera:camera-core"` | 1.3.3 | 1.3.4 | +| CameraX Lifecycle | camerax | `"androidx.camera:camera-lifecycle"` | 1.3.3 | 1.3.4 | +| CameraX View | camerax | `"androidx.camera:camera-view"` | 1.3.3 | 1.3.4 | +| CameraX Camera2 | camerax | `"androidx.camera:camera-camera2"` | 1.3.3 | 1.3.4 | +| Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.8.1 | 2.8.6 | +| Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.8.1 | 2.8.6 | +| Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.8.1 | 2.8.6 | +| Tensorflow Lite | docfinder, liveness | `"org.tensorflow:tensorflow-lite"` | 2.16.1 | REMOVED | +| LiteRT | docfinder, liveness | `"com.google.ai.edge.litert:litert"` | ADDED | 1.0.1 | +| Tensorflow Lite Metadata | docfinder | `"org.tensorflow:tensorflow-lite-metadata"` | 0.4.4 | REMOVED | +| LiteRT Metadata | docfinder | `"com.google.ai.edge.litert:litert-metadata"` | ADDED | 1.0.1 | +| IProov | iproov | `"com.iproov.sdk:iproov"` | 9.1.1 | 9.1.2 | +| JMRTD | nfc | `"org.jmrtd:jmrtd"` | 0.7.41 | 0.7.42 | +| Scube | nfc | `"net.sf.scuba:scuba-sc-android"` | 0.0.25 | 0.0.26 | +| BouncyCastle | nfc | `"org.bouncycastle:bcprov-jdk18on"` | 1.77 | 1.78.1 | +| MLKit Barcode | barcode-mlkit | `"com.google.android.gms:play-services-mlkit-barcode-scanning"` | 18.3.0 | 18.3.1 | + +#### Packaging Options +Multiple third party android libraries include the same meta files which will result in duplicates files during the build. +Please see the [FAQ](integration_faq.md#packaging-options) section for that. + +#### SDK Localizations Changes + +##### New strings +| new | +|---------------------------------------| +| `jumio_liveness_prompt_keep_centered` | +| `jumio_liveness_prompt_keep_still` | +| `jumio_liveness_prompt_keep_upright` | +| `jumio_liveness_prompt_tilt_down` | +| `jumio_liveness_prompt_tilt_left` | +| `jumio_liveness_prompt_tilt_right` | +| `jumio_liveness_prompt_tilt_up` | +| `jumio_liveness_scanning_completed` | + +##### Renamed strings +| old | new | +|----------------------------------------------|----------------------------------------------| +| `jumio_liveness_prompt_success_another_shot` | `jumio_liveness_prompt_success_another_scan` | +| `jumio_liveness_prompt_too_close` | `jumio_liveness_prompt_move_away` | +| `jumio_error_case_ocr_failed` | `jumio_error_case_scanning_not_possible` | + + ## 4.11.0 #### Public API Changes * `TILT` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) alongside with [`JumioTiltState`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.core/-jumio-tilt-state/index.html) @@ -28,7 +93,7 @@ __Example:__ If you're updating from SDK version __3.7.2__ to __3.9.2__, the cha | Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.7.0 | 2.8.1 | | Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.7.0 | 2.8.1 | | Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.7.0 | 2.8.1 | -| iProov | iproov | `"com.iproov.sdk:iproov"` | 9.0.4 | 9.1.1 | +| IProov | iproov | `"com.iproov.sdk:iproov"` | 9.0.4 | 9.1.1 | #### Customization Changes * `jumio_divider_color` has been added to customize the color of list dividers @@ -80,12 +145,10 @@ No backward incompatible changes * Property `DEVICE_RISK` has been removed from [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) * Property `DEVICE_RISK` has been removed from [`JumioCredentialPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html) - #### Dependency Updates * Removed Devicerisk dependency: ~~`implementation "com.jumio.android:devicerisk:4.8.1"`~~ * IProov update: ~~`"com.iproov.sdk:iproov:8.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:9.0.3"`. Please note that this update also includes a major UI/UX upgrade. - #### Customization Changes * The following customization color attributes have been added: * `` @@ -156,18 +219,15 @@ No backward incompatible changes * `` * `` - * The following customization attributes have been added to `@style/CustomOverlay` theme: * `` * `` * ``~~ * ~~``~~ - * See also: [Jumio sample `styles.xml`](../sample/JumioMobileSample/src/main/res/values/styles.xml) #### Dependency Updates @@ -343,7 +403,7 @@ As of SDK version 4.0.0, a lot of SDK parameters that previously could be set in Please refer to the [Configuration section](integration_guide.md#configuration) of our integration guides for a detailed description of all Default UI changes and updates. -Information about which user journey (ID Verification, Identity Verification, Authentication, ...) the SDK is going to provide now also has to be specified during the API call that request the `sdk.token`. +Information about which user journey (ID Verification, Selfie Verification, Authentication, ...) the SDK is going to provide now also has to be specified during the API call that request the `sdk.token`. For more details on individual Jumio workflows, please refer to [Workflow Descriptions](https://github.com/Jumio/implementation-guides/blob/master/api-guide/workflow_descriptions.md) in our guides. @@ -374,7 +434,6 @@ No backward incompatible changes * `iproov_livenessScanningTintColor` * `iproov_progressBarColor` - ## 3.9.1 #### Dependency Changes * IProov update: ~~`"com.iproov.sdk:iproov:6.3.0"`~~ is replaced by `"com.iproov.sdk:iproov:6.3.1"`. This version fixes cross-dependency problems with okhttp 4.x @@ -409,7 +468,6 @@ No backward incompatible changes * [`EXTRA_ACCOUNT_ID`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html#EXTRA_ACCOUNT_ID) * [`EXTRA_SCAN_DATA`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html#EXTRA_SCAN_DATA) - * [`NetverifyCustomSDKInterface$onNetverifyError`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomSDKInterface.html#onNetverifyError-java.lang.String-java.lang.String-boolean-java.lang.String-java.lang.String-) added an optional parameter `accountId` * New methods for handling host activity lifecycle changes have been added: @@ -461,7 +519,6 @@ Please note that the naming of this will change with the Android Gradle Plugin 4 __or__ * `"com.jumio.android:zoom:3.8.0@aar"` and `"com.facetec:zoom-authentication:8.12.1@aar"` - * AndroidX ConstraintLayout update: ~~`"androidx.constraintlayout:constraintlayout:2.0.1"`~~ is replaced by `"androidx.constraintlayout:constraintlayout:2.0.4"` * AndroidX Appcompat update: ~~`"androidx.appcompat:appcompat:1.1.0"`~~ is replaced by `"androidx.appcompat:appcompat:1.2.0"` @@ -682,7 +739,6 @@ The following methods and the related parameters have been renamed to ensure con #### Additional Property in NetverifyCustomScanView `setMode(..)` must be called before the view is used. Possible values: NetverifyCustomScanView.MODE_ID or NetverifyCustomScanView.MODE_FACE - ## 2.15.0 #### Added Room Dependencies that have been added to the SDK: @@ -858,7 +914,6 @@ Name matching by comparing a provided name with the extracted name from a docume #### Changes in Customization Additions for the customization options to support the configuration of all scan overlays. - ## Copyright © Jumio Corp. 395 Page Mill Road, Palo Alto, CA 94306 diff --git a/sample/JumioMobileSample/build.gradle b/sample/JumioMobileSample/build.gradle index bbe89010..1e142a7a 100644 --- a/sample/JumioMobileSample/build.gradle +++ b/sample/JumioMobileSample/build.gradle @@ -1,17 +1,23 @@ buildscript { - ext.kotlin_version = "1.9.24" + ext.kotlin_version = "2.0.0" repositories { google() mavenCentral() gradlePluginPortal() } dependencies { - classpath "com.android.tools.build:gradle:8.2.2" + classpath "com.android.tools.build:gradle:8.6.1" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + classpath "org.jetbrains.kotlin:compose-compiler-gradle-plugin:$kotlin_version" } } + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'org.jetbrains.kotlin.plugin.serialization' +apply plugin: 'org.jetbrains.kotlin.plugin.parcelize' +apply plugin: 'org.jetbrains.kotlin.plugin.compose' repositories { google() @@ -31,17 +37,26 @@ repositories { } ext { - SDK_VERSION = "4.11.0" + SDK_VERSION = "4.12.0" } dependencies { implementation fileTree(dir: 'libs', include: '*.jar') // Kotlin - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.24" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.0" // only for the sample code - implementation "androidx.activity:activity-ktx:1.9.0" + implementation "androidx.activity:activity-ktx:1.9.2" implementation "androidx.multidex:multidex:2.0.1" + implementation platform("androidx.compose:compose-bom:2024.09.03") + implementation "androidx.compose.material3:material3" + implementation "androidx.compose.ui:ui" + implementation "androidx.compose.ui:ui-tooling-preview" + implementation "androidx.activity:activity-compose:1.9.2" + implementation "androidx.compose.compiler:compiler:1.5.15" + implementation "androidx.navigation:navigation-compose:2.8.2" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" + implementation "androidx.lifecycle:lifecycle-runtime-compose:2.8.6" // Jumio dependencies implementation "com.jumio.android:core:${SDK_VERSION}" @@ -57,15 +72,15 @@ dependencies { } android { - compileSdkVersion 34 - buildToolsVersion "34.0.0" + compileSdkVersion 35 + buildToolsVersion "35.0.0" namespace "com.jumio.sample" defaultConfig { versionCode 1 versionName "Jumio Sample" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 multiDexEnabled true vectorDrawables.useSupportLibrary true } @@ -75,15 +90,17 @@ android { viewBinding true // Determines whether to support Data Binding. dataBinding false + // Determines whether to support Jetpack Compose. + compose true } compileOptions { - sourceCompatibility 11 - targetCompatibility 11 + sourceCompatibility 17 + targetCompatibility 17 } kotlinOptions { - jvmTarget = 11 + jvmTarget = 17 } lint { @@ -98,4 +115,17 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + packagingOptions { + resources.excludes.add("META-INF/kotlin-project-structure-metadata.json") + resources.excludes.add("META-INF/kotlinx_coroutines_core.version") + resources.excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF") + resources.excludes.add("commonMain/default/manifest") + } + + composeOptions { + // compose version must be compatible with kotlin version (version of org.jetbrains.kotlin:kotlin-gradle-plugin) + // Refer to https://developer.android.com/jetpack/androidx/releases/compose-kotlin + kotlinCompilerExtensionVersion = "1.5.15" + } } \ No newline at end of file diff --git a/sample/JumioMobileSample/gradle/wrapper/gradle-wrapper.properties b/sample/JumioMobileSample/gradle/wrapper/gradle-wrapper.properties index 350d1988..4b4081bc 100644 --- a/sample/JumioMobileSample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/JumioMobileSample/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jun 07 10:54:50 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sample/JumioMobileSample/src/main/AndroidManifest.xml b/sample/JumioMobileSample/src/main/AndroidManifest.xml index 406ea0e4..c1a40ceb 100644 --- a/sample/JumioMobileSample/src/main/AndroidManifest.xml +++ b/sample/JumioMobileSample/src/main/AndroidManifest.xml @@ -26,9 +26,10 @@ @@ -37,7 +38,35 @@ + + + + + + + + + + + + + diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/activities/CustomUIActivity.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/activities/CustomUIActivity.kt new file mode 100644 index 00000000..51f2f177 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/activities/CustomUIActivity.kt @@ -0,0 +1,279 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.activities + +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.core.app.ActivityCompat +import androidx.lifecycle.lifecycleScope +import androidx.navigation.NavDestination.Companion.hasRoute +import androidx.navigation.NavOptions +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import androidx.navigation.toRoute +import com.jumio.defaultui.JumioActivity +import com.jumio.sample.compose.theme.JumioTheme +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sample.compose.viewModel.ViewModelFactory +import com.jumio.sample.compose.views.navigation.AppNavigation +import com.jumio.sample.compose.views.pages.AcquireModeSelectionPage +import com.jumio.sample.compose.views.pages.ConfirmationPage +import com.jumio.sample.compose.views.pages.ConsentPage +import com.jumio.sample.compose.views.pages.CountryAndDocumentSelectionPage +import com.jumio.sample.compose.views.pages.DigitalIdentityPage +import com.jumio.sample.compose.views.pages.ErrorPage +import com.jumio.sample.compose.views.pages.LoaderPage +import com.jumio.sample.compose.views.pages.NfcScanPage +import com.jumio.sample.compose.views.pages.RejectionPage +import com.jumio.sample.compose.views.pages.ScanPage +import com.jumio.sample.compose.views.pages.UploadFileHelpPage +import com.jumio.sdk.JumioSDK +import com.jumio.sdk.enums.JumioDataCenter +import com.jumio.sdk.enums.JumioScanStep +import com.jumio.sdk.views.JumioActivityAttacher +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +private const val EXTRA_TOKEN = "token" +private const val EXTRA_DATACENTER = "datacenter" +private const val TAG = "CustomUIActivity" +private const val PERMISSION_REQUEST_CODE = 100 +private const val EXTRA_CUSTOMTHEME = "customtheme" + +class CustomUIActivity : ComponentActivity() { + + private val viewModel: CustomUIViewModel by viewModels { + val token = intent.getStringExtra(EXTRA_TOKEN) as String + val dataCenter = intent.getStringExtra(EXTRA_DATACENTER)?.let { JumioDataCenter.valueOf(it) } as JumioDataCenter + val customTheme = intent.getIntExtra(EXTRA_CUSTOMTHEME, 0) + ViewModelFactory( + owner = this, + application = this.application, + token = token, + dataCenter = dataCenter, + customTheme = customTheme + ) + } + + private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + try { + result.data?.let { + val returnUri = it.data ?: throw Exception("Could not get Uri") + contentResolver.openFileDescriptor(returnUri, "r")?.use { fileDescriptor -> + viewModel.fileAttacher.setFileDescriptor(fileDescriptor) + } ?: throw Exception("Could not open file descriptor") + } + } catch (exception: Exception) { + showError(exception.message) + } + } + } + + private fun validatePermissions(): Boolean { + if (JumioSDK.hasAllRequiredPermissions(this)) { + return true + } + + val mp = JumioSDK.getMissingPermissions(this) + ActivityCompat.requestPermissions(this, mp, PERMISSION_REQUEST_CODE) + + return false + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + if (requestCode != PERMISSION_REQUEST_CODE || + grantResults.isEmpty() || + grantResults[0] != PackageManager.PERMISSION_GRANTED + ) { + finish() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setObserver() + enableEdgeToEdge() + setContent { + JumioTheme { + Scaffold( + content = { + SetContent(modifier = Modifier.consumeWindowInsets(it).padding(it)) + } + ) + } + } + validatePermissions() + } + + @Composable + fun SetContent(modifier: Modifier) { + val navController = rememberNavController() + LaunchedEffect(viewModel.navigationState) { + viewModel.navigationState.collectLatest { navigationState -> + navigationState?.let { navigationPage -> + viewModel.navigationState.value = null + if (viewModel.isNewCredentialStarted) { + viewModel.isNewCredentialStarted = false + navController.navigate(navigationPage, NavOptions.Builder().setPopUpTo(AppNavigation.Consent, false).build()) + return@collectLatest + } + navController.previousBackStackEntry?.destination?.let { destination -> + if ( + (destination.hasRoute() && navigationPage == AppNavigation.Scan) || + (destination.hasRoute() && navigationPage == AppNavigation.UploadFileHelp) || + (destination.hasRoute() && navigationPage == AppNavigation.NfcScan) + ) { + navController.popBackStack() + return@collectLatest + } + } + navController.currentBackStackEntry?.destination?.let { destination -> + if (destination.hasRoute(AppNavigation.Loader::class) || + destination.hasRoute(AppNavigation.Error::class) || + destination.hasRoute(AppNavigation.Confirmation::class) || + destination.hasRoute(AppNavigation.Rejection::class) + ) { + navController.navigate(navigationPage, NavOptions.Builder().setPopUpTo(destination.id, true).build()) + } else { + navController.navigate(navigationPage, NavOptions.Builder().build()) + } + } ?: run { + navController.navigate(navigationPage, NavOptions.Builder().build()) + } + } + } + } + + NavHost(navController = navController, startDestination = AppNavigation.Consent) { + composable { + ConsentPage(viewModel = viewModel, modifier = modifier, onClose = ::closeAndFinish) + } + composable { + CountryAndDocumentSelectionPage(viewModel = viewModel, modifier = modifier, onClose = ::closeAndFinish) + } + composable { + ScanPage(viewModel = viewModel, modifier = modifier) + } + composable { + AcquireModeSelectionPage( + viewModel = viewModel, + modifier = modifier, + onClose = ::closeAndFinish + ) + } + composable { + DigitalIdentityPage(viewModel = viewModel, modifier = modifier) + } + composable { + ConfirmationPage(viewModel = viewModel, modifier = modifier, onClose = ::closeAndFinish) + } + composable { + RejectionPage(viewModel = viewModel, modifier = modifier, onClose = ::closeAndFinish) + } + composable { + val args = it.toRoute() + LoaderPage(title = args.title, modifier = modifier) + } + composable { + val args = it.toRoute() + ErrorPage( + message = args.message, + isRetryable = args.isRetryable, + onRetryClick = { + viewModel.onRetry() + }, + onClose = ::closeAndFinish, + modifier = modifier + ) + } + composable { + UploadFileHelpPage( + requirements = viewModel.fileAttacher.requirements, + onSelectFile = { + openDocument() + }, + onBack = { + navController.popBackStack() + }, + modifier = modifier + ) + } + composable { + NfcScanPage( + viewModel = viewModel, + onClose = ::closeAndFinish, + onBackPress = { + viewModel.cancelCurrentScanPart() + navController.popBackStack(AppNavigation.Scan, true) + }, + modifier = modifier + ) + } + } + } + + private fun openDocument() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "*/*" + putExtra(Intent.EXTRA_MIME_TYPES, viewModel.fileAttacher.requirements.mimeTypes.toTypedArray()) + } + try { + launcher.launch(intent) + } catch (exception: Exception) { + showError(exception.message) + } + } + + private fun showError(message: String?) { + Toast.makeText(this, message ?: "Unknown Error", Toast.LENGTH_LONG).show() + } + + private fun setObserver() { + lifecycleScope.launch { + viewModel.workflowResult.collectLatest { jumioResult -> + jumioResult?.let { + val data = Intent() + data.putExtra(JumioActivity.EXTRA_RESULT, it) + setResult(RESULT_OK, data) + finish() + } + } + } + lifecycleScope.launch { + viewModel.scanStepEvent.collectLatest { jumioScanStep -> + jumioScanStep?.let { scanStep -> + if (scanStep == JumioScanStep.ATTACH_ACTIVITY) { + viewModel.currentScanPart?.let { JumioActivityAttacher(this@CustomUIActivity).attach(it) } + } + } + } + } + } + + private fun closeAndFinish() { + viewModel.finishController() + finish() + } + + override fun onDestroy() { + viewModel.finishController() + super.onDestroy() + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/activities/MainActivity.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/activities/MainActivity.kt new file mode 100644 index 00000000..7fbe3d1e --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/activities/MainActivity.kt @@ -0,0 +1,270 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.activities + +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.DrawerValue +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.rememberDrawerState +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.core.app.ActivityCompat +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.jumio.defaultui.JumioActivity +import com.jumio.sample.R +import com.jumio.sample.compose.theme.JumioTheme +import com.jumio.sample.compose.views.atoms.AppBar +import com.jumio.sample.compose.views.molecules.NavigationDrawerMenu +import com.jumio.sample.compose.views.pages.HomePage +import com.jumio.sample.compose.views.pages.ResultPage +import com.jumio.sdk.JumioSDK +import com.jumio.sdk.preload.JumioPreloadCallback +import com.jumio.sdk.preload.JumioPreloader +import com.jumio.sdk.result.JumioResult +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch + +private const val TAG = "MainActivity" +private const val PERMISSION_REQUEST_CODE: Int = 303 +private const val EXTRA_TOKEN = "token" +private const val EXTRA_DATACENTER = "datacenter" +private const val EXTRA_CUSTOMTHEME = "customtheme" + +class MainActivity : ComponentActivity(), JumioPreloadCallback { + + private var showBottomSheet = MutableStateFlow(false) + private var jumioResult: JumioResult? = null + private val sdkForResultLauncher: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + jumioResult = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + result.data?.getSerializableExtra(JumioActivity.EXTRA_RESULT, JumioResult::class.java) + } else { + @Suppress("DEPRECATION") + result.data?.getSerializableExtra(JumioActivity.EXTRA_RESULT) as JumioResult? + } + showBottomSheet.value = true + Log.d(TAG, "AccountId: ${jumioResult?.accountId}") + Log.d(TAG, "WorkflowExecutionId: ${jumioResult?.workflowExecutionId}") + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + SetUpUI() + } + initModelPreloading() + } + + @OptIn(ExperimentalMaterial3Api::class) + @Composable + private fun SetUpUI() { + JumioTheme { + val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) + val scope = rememberCoroutineScope() + val snackBarHostState = remember { SnackbarHostState() } + val sheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = false + ) + val showBottomSheet = this.showBottomSheet.collectAsStateWithLifecycle() + ModalNavigationDrawer( + drawerState = drawerState, + drawerContent = { + NavigationDrawerMenu( + openLink = { + openLink(it) + }, + cleanModels = { + with(JumioPreloader) { + init(this@MainActivity) + clean() + dispose() + } + } + ) + } + ) { + Scaffold( + modifier = Modifier.fillMaxSize(), + snackbarHost = { + SnackbarHost(hostState = snackBarHostState) + }, + topBar = { + AppBar( + title = stringResource(id = R.string.app_bar_title), + onNavigationIconClick = { + scope.launch { + drawerState.apply { + if (isClosed) open() else close() + } + } + } + ) + }, + content = { innerPadding -> + HomePage( + modifier = Modifier.padding(innerPadding), + onCustomUiClick = { token, dataCenter -> + onCustomUIClick(scope, snackBarHostState, token, dataCenter) + }, + onDefaultUiClick = { token, dataCenter -> + onDefaultUIClick(scope, snackBarHostState, token, dataCenter) + } + ) + if (showBottomSheet.value) { + jumioResult?.let { result -> + ModalBottomSheet( + onDismissRequest = { + this.showBottomSheet.value = false + }, + sheetState = sheetState, + modifier = Modifier.fillMaxSize() + ) { + ResultPage(jumioResult = result) { + scope.launch { sheetState.hide() }.invokeOnCompletion { + if (!sheetState.isVisible) { + this@MainActivity.showBottomSheet.value = false + } + } + } + } + } ?: run { + this.showBottomSheet.value = false + } + } + } + ) + } + } + } + + private fun onCustomUIClick( + scope: CoroutineScope, + snackBarHostState: SnackbarHostState, + token: String, + dataCenter: String, + ) { + if (!isTokenSet(scope, snackBarHostState, token)) return + if (!isSupportedPlatform(scope, snackBarHostState)) return + if (!checkPermissions()) return + val intent = Intent(this, CustomUIActivity::class.java).apply { + putExtra(EXTRA_TOKEN, token) + putExtra(EXTRA_DATACENTER, dataCenter) + // The following parameter can be used to apply a custom theme: + putExtra(EXTRA_CUSTOMTHEME, R.style.AppThemeCustomJumio) + } + sdkForResultLauncher.launch(intent) + } + + private fun onDefaultUIClick( + scope: CoroutineScope, + snackBarHostState: SnackbarHostState, + token: String, + dataCenter: String, + ) { + if (!isTokenSet(scope, snackBarHostState, token)) return + if (!isSupportedPlatform(scope, snackBarHostState)) return + if (!checkPermissions()) return + val intent = Intent(this, JumioActivity::class.java) + intent.putExtra(JumioActivity.EXTRA_TOKEN, token) + intent.putExtra(JumioActivity.EXTRA_DATACENTER, dataCenter) + // The following intent extra can be used to customize the Theme of Default UI + // intent.putExtra(JumioActivity.EXTRA_CUSTOM_THEME, R.style.AppThemeCustomJumio) + sdkForResultLauncher.launch(intent) + } + + /** + * [JumioPreloadCallback.preloadFinished] will be called by the [JumioPreloader] once + * preloading finished. You may want to start the jumio sdk at this point. + */ + + override fun preloadFinished() { + Log.d(TAG, "Preloading finished") + + // Once preloading is finished successfully we can dispose the preloader (optional) + JumioPreloader.dispose() + } + + /** + * This functions shows how to setup the [JumioPreloader] and initiate preloading. + * + * Preloading in this case means that the SDK checks which models are required, and downloads them in advance. + */ + private fun initModelPreloading() = with(JumioPreloader) { + init(this@MainActivity) + setCallback(this@MainActivity) + preloadIfNeeded() + } + + /** + * Check and request missing permissions for the SDK. + * + * @param requestCode the request code for the SDK + */ + private fun checkPermissions(requestCode: Int = PERMISSION_REQUEST_CODE) = + if (!JumioSDK.hasAllRequiredPermissions(this)) { + // Acquire missing permissions. + val mp = JumioSDK.getMissingPermissions(this) + ActivityCompat.requestPermissions( + this, + mp, + requestCode + ) // The result is received in onRequestPermissionsResult. + false + } else { + true + } + + private fun openLink(url: String) { + val intent = Intent(Intent.ACTION_VIEW).apply { + data = Uri.parse(url) + } + startActivity(intent) + } + + private fun isSupportedPlatform(scope: CoroutineScope, snackBarHostState: SnackbarHostState) = + if (!JumioSDK.isSupportedPlatform(this)) { + scope.launch { + snackBarHostState.showSnackbar( + message = "This device is not supported!", + duration = SnackbarDuration.Long + ) + } + false + } else { + true + } + + private fun isTokenSet(scope: CoroutineScope, snackBarHostState: SnackbarHostState, token: String) = + if (token.isBlank()) { + scope.launch { + snackBarHostState.showSnackbar( + message = "Token needs to be set", + duration = SnackbarDuration.Long + ) + } + false + } else { + true + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/extension/JumioDocument.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/extension/JumioDocument.kt new file mode 100644 index 00000000..c1087322 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/extension/JumioDocument.kt @@ -0,0 +1,18 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.extension + +import com.jumio.sdk.document.JumioDigitalDocument +import com.jumio.sdk.document.JumioDocument +import com.jumio.sdk.document.JumioPhysicalDocument + +fun JumioDocument.getName() = when (this) { + is JumioPhysicalDocument -> { + "${this.type.name} - ${this.variant.name}" + } + is JumioDigitalDocument -> { + this.type + } + else -> { + "" + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Color.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Color.kt new file mode 100644 index 00000000..dc059e28 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Color.kt @@ -0,0 +1,55 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.graphics.Color + +val Primary = Color(0xFF2ABC6D) +val PrimaryDark = Color(0xFF008B41) +val Secondary = Color(0xFFEDF1F5) + +data class CustomColors( + val primary: Color = Color.Unspecified, + val primaryDark: Color = Color.Unspecified, + val secondary: Color = Color.Unspecified, + val info: Color = Color.Unspecified, + val label: Color = Color.Unspecified, + val unFocusedIndicator: Color = Color.Unspecified, + val background: Color = Color.Unspecified, + val checkBox: Color = Color.Unspecified, + val error: Color = Color.Unspecified, +) + +val lightCustomColors = CustomColors( + primary = Color(0xFF2ABC6D), + primaryDark = Color(0xFF008B41), + secondary = Color(0xFFEDF1F5), + info = Color(0xFF303F9F), + label = Color(0xFF000000), + unFocusedIndicator = Color(0xFF000000), + background = Color(0xFFFFFFFF), + checkBox = Color(0xFFFFFFFF), + error = Color(0xFFFF5722) +) + +val darkCustomColors = CustomColors( + primary = Color(0xFF2ABC6D), + primaryDark = Color(0xFF008B41), + secondary = Color(0xFFEDF1F5), + info = Color(0xFF303F9F), + label = Color(0xFFFFFFFF), + unFocusedIndicator = Color(0xFFFFFFFF), + background = Color(0xFF000000), + checkBox = Color(0xFF000000), + error = Color(0xFFFF5722) +) + +val LocalCustomColors = compositionLocalOf { CustomColors() } + +val MaterialTheme.colors: CustomColors + @Composable + @ReadOnlyComposable + get() = LocalCustomColors.current diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Dimensions.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Dimensions.kt new file mode 100644 index 00000000..063c39af --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Dimensions.kt @@ -0,0 +1,28 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +@Immutable +data class Dimensions( + val buttonSize: Dp = Dp.Unspecified, + val animationViewSize: Dp = Dp.Unspecified, +) + +val customDimensions = Dimensions( + buttonSize = 56.dp, + animationViewSize = 340.dp +) + +val LocalDimensions = compositionLocalOf { Dimensions() } + +val MaterialTheme.dimensions: Dimensions + @Composable + @ReadOnlyComposable + get() = LocalDimensions.current diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Spacing.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Spacing.kt new file mode 100644 index 00000000..966ae3e4 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Spacing.kt @@ -0,0 +1,32 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +@Immutable +data class Spacing( + val default: Dp = 0.dp, + val ultraSmall: Dp = 2.dp, + val extraSmall: Dp = 4.dp, + val superSmall: Dp = 6.dp, + val small: Dp = 8.dp, + val compact: Dp = 12.dp, + val medium: Dp = 16.dp, + val semiLarge: Dp = 24.dp, + val large: Dp = 32.dp, + val superLarge: Dp = 48.dp, + val extraLarge: Dp = 64.dp, +) + +val LocalSpacing = compositionLocalOf { Spacing() } + +val MaterialTheme.spacing: Spacing + @Composable + @ReadOnlyComposable + get() = LocalSpacing.current diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Theme.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Theme.kt new file mode 100644 index 00000000..bb004473 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Theme.kt @@ -0,0 +1,57 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.theme + +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Primary, + secondary = PrimaryDark, + tertiary = Secondary +) + +private val LightColorScheme = lightColorScheme( + primary = Primary, + secondary = PrimaryDark, + tertiary = Secondary +) + +@Composable +fun JumioTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit, +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + val customColors = if (darkTheme) darkCustomColors else lightCustomColors + + CompositionLocalProvider( + LocalDimensions provides customDimensions, + LocalSpacing provides Spacing(), + LocalCustomColors provides customColors + ) { + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Type.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Type.kt new file mode 100644 index 00000000..b1a4c65a --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/theme/Type.kt @@ -0,0 +1,39 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ), + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelMedium = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 20.sp, + lineHeight = 22.sp, + letterSpacing = 0.5.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) +) diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/CustomUIEvent.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/CustomUIEvent.kt new file mode 100644 index 00000000..aa417a43 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/CustomUIEvent.kt @@ -0,0 +1,12 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.viewModel + +import com.jumio.sdk.document.JumioDocument +import com.jumio.sdk.enums.JumioAcquireMode + +sealed class CustomUIEvent { + data object StartClicked : CustomUIEvent() + data class CountrySelected(val country: String) : CustomUIEvent() + data class DocumentSelected(val document: JumioDocument) : CustomUIEvent() + data class AcquireModeClicked(val mode: JumioAcquireMode) : CustomUIEvent() +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/CustomUIViewModel.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/CustomUIViewModel.kt new file mode 100644 index 00000000..7a768498 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/CustomUIViewModel.kt @@ -0,0 +1,517 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.viewModel + +import android.app.Application +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope +import com.jumio.sample.R +import com.jumio.sample.compose.views.navigation.AppNavigation +import com.jumio.sdk.JumioSDK +import com.jumio.sdk.consent.JumioConsentItem +import com.jumio.sdk.controller.JumioController +import com.jumio.sdk.credentials.JumioCredential +import com.jumio.sdk.credentials.JumioCredentialInfo +import com.jumio.sdk.credentials.JumioDocumentCredential +import com.jumio.sdk.credentials.JumioFaceCredential +import com.jumio.sdk.credentials.JumioIDCredential +import com.jumio.sdk.data.JumioTiltState +import com.jumio.sdk.document.JumioDocument +import com.jumio.sdk.enums.JumioConsentType +import com.jumio.sdk.enums.JumioCredentialPart +import com.jumio.sdk.enums.JumioDataCenter +import com.jumio.sdk.enums.JumioScanMode +import com.jumio.sdk.enums.JumioScanStep +import com.jumio.sdk.enums.JumioScanUpdate +import com.jumio.sdk.error.JumioError +import com.jumio.sdk.exceptions.SDKNotConfiguredException +import com.jumio.sdk.handler.JumioConfirmationHandler +import com.jumio.sdk.handler.JumioRejectHandler +import com.jumio.sdk.interfaces.JumioControllerInterface +import com.jumio.sdk.interfaces.JumioScanPartInterface +import com.jumio.sdk.result.JumioResult +import com.jumio.sdk.retry.JumioRetryReason +import com.jumio.sdk.scanpart.JumioScanPart +import com.jumio.sdk.views.JumioFileAttacher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +private const val TAG = "CustomUIViewModel" + +class CustomUIViewModel( + val savedStateHandle: SavedStateHandle, + application: Application, + token: String, + dataCenter: JumioDataCenter, + customTheme: Int, +) : AndroidViewModel(application), JumioControllerInterface, JumioScanPartInterface { + + val consentPageLoaderState = MutableStateFlow(false) + var navigationState = MutableStateFlow(null) + private set + + val confirmationHandler: JumioConfirmationHandler = JumioConfirmationHandler() + val rejectHandler: JumioRejectHandler = JumioRejectHandler() + val fileAttacher = JumioFileAttacher() + private var jumioError: JumioError? = null + private var retryReason: JumioRetryReason? = null + + private var jumioController: JumioController? = null + + var credentialInfoList: List = emptyList() + private set + var currentCredential: JumioCredential? = null + private set + + private var currentCredentialPart: JumioCredentialPart? = null + var currentScanPart: JumioScanPart? = null + var countryList: List = listOf() + private set + var documentList = MutableStateFlow>(listOf()) + private set + + var scanStepEvent = MutableStateFlow(null) + var scanUpdateEvent = MutableStateFlow?>(null) + + private var currentCredentialInfo: JumioCredentialInfo? + get() = savedStateHandle["currentCredentialInfo"] + set(value) = savedStateHandle.set("currentCredentialInfo", value) + + var selectedCountry: String + get() = savedStateHandle["selectedCountry"] ?: "" + private set(value) = savedStateHandle.set("selectedCountry", value) + var consentItems: List + get() = savedStateHandle["consentItems"] ?: emptyList() + private set(value) = savedStateHandle.set("consentItems", value) + var scanAlignmentState = MutableStateFlow("") + private set + var flipDocument = MutableStateFlow("") + private set + val workflowResult = MutableStateFlow(null) + var isNewCredentialStarted = false + + init { + val jumioSDKHandle = savedStateHandle.get("jumioSDK") + savedStateHandle.setSavedStateProvider("jumioSDK") { + val data = Bundle() + jumioController?.persist(data) + data + } + val jumioSDK = JumioSDK(application.applicationContext).apply { + this.token = token + this.dataCenter = dataCenter + if (customTheme != 0) { + customThemeId = customTheme + } + } + if (jumioSDKHandle == null) { + consentPageLoaderState.value = true + jumioController = jumioSDK.start(application, this) + } else { + jumioSDK.restore( + getApplication(), + jumioSDKHandle, + this, + this + ) { controller, credentials, activeCredential, activeScanPart -> + jumioController = controller + credentialInfoList = credentials + currentCredential = activeCredential + currentScanPart = activeScanPart + onInitialized(credentials, controller.getUnconsentedItems()) + setUpCredential() + } + } + } + + override fun onInitialized(credentials: List, consentItems: List?) { + credentialInfoList = credentials + this.consentItems = consentItems ?: listOf() + consentItems?.forEach { consentItem -> + if (consentItem.type == JumioConsentType.PASSIVE) { + jumioController?.userConsented(consentItem, true) + } + } + consentPageLoaderState.value = false + } + + override fun onError(error: JumioError) { + Log.e(TAG, "onError ${error.message}") + this.jumioError = error + val errorMessage = "onError ${error.code} ${error.message} retry-able: ${if (error.isRetryable) "true" else "false"}" + navigationState.value = AppNavigation.Error(errorMessage, error.isRetryable) + } + + /** + * The workflow is now finished and the [result] can be consumed + */ + override fun onFinished(result: JumioResult) { + Log.d(TAG, "onFinished") + workflowResult.value = result + } + + override fun onUpdate(jumioScanUpdate: JumioScanUpdate, data: Any?) { + Log.d(TAG, "onUpdate $jumioScanUpdate $data") + when (jumioScanUpdate) { + JumioScanUpdate.CENTER_ID, + JumioScanUpdate.CENTER_FACE, + JumioScanUpdate.LEVEL_EYES_AND_DEVICE, + JumioScanUpdate.HOLD_STRAIGHT, + JumioScanUpdate.MOVE_CLOSER, + JumioScanUpdate.TOO_CLOSE, + JumioScanUpdate.HOLD_STILL, + JumioScanUpdate.MOVE_FACE_CLOSER, + JumioScanUpdate.FACE_TOO_CLOSE, + JumioScanUpdate.MOVE_FACE_INTO_FRAME, + JumioScanUpdate.TILT_FACE_UP, + JumioScanUpdate.TILT_FACE_DOWN, + JumioScanUpdate.TILT_FACE_LEFT, + JumioScanUpdate.TILT_FACE_RIGHT, + -> { + scanAlignmentState.value = jumioScanUpdate.name + } + JumioScanUpdate.TILT -> { + scanAlignmentState.value = (data as? JumioTiltState)?.let { + "${jumioScanUpdate.name} currentAngle = ${it.currentAngle} targetAngle = ${it.targetAngle}" + } ?: run { + jumioScanUpdate.name + } + } + else -> { + scanAlignmentState.value = "" + } + } + scanUpdateEvent.value = Pair(jumioScanUpdate, data) + } + + override fun onScanStep(jumioScanStep: JumioScanStep, data: Any?) { + Log.d(TAG, "onScanStep $jumioScanStep $data") + val context = getApplication().applicationContext + scanStepEvent.value = jumioScanStep + when (jumioScanStep) { + JumioScanStep.PREPARE -> { + navigationState.value = + AppNavigation.Loader(title = context.getString(R.string.loading)) + } + + JumioScanStep.STARTED -> { + // Hide loader + } + + JumioScanStep.ATTACH_ACTIVITY -> {} + + JumioScanStep.ATTACH_FILE -> { + currentScanPart?.let { fileAttacher.attach(it) } + navigationState.value = AppNavigation.UploadFileHelp + } + + JumioScanStep.SCAN_VIEW -> { + setUpScanView() + } + + JumioScanStep.IMAGE_TAKEN -> { + // Nothing to do in the custom ui implementation + } + + JumioScanStep.NEXT_PART -> { + flipDocument.value = context.getString(R.string.flip_document) + " $data" + viewModelScope.launch(Dispatchers.Main) { + delay(3000) + flipDocument.value = "" + } + } + + JumioScanStep.PROCESSING -> { + navigationState.value = + AppNavigation.Loader(title = context.getString(R.string.processing)) + } + + JumioScanStep.CONFIRMATION_VIEW -> { + navigationState.value = AppNavigation.Confirmation + } + + JumioScanStep.REJECT_VIEW -> { + // To display granular feedback, check against the values provided in [com.jumio.sdk.reject.JumioRejectReason] + // + // when(data) { + // JumioRejectReason.BLURRY -> ... + // JumioRejectReason.DIGITAL_COPY -> ... + // ... + // } + currentScanPart?.let { + rejectHandler.attach(it) + } + navigationState.value = AppNavigation.Rejection + } + + JumioScanStep.RETRY -> { + retryReason = data as? JumioRetryReason + val errorMessage = retryReason?.let { "${it.code}\n${it.message}" } ?: "Unknown Error" + navigationState.value = AppNavigation.Error( + message = errorMessage, + isRetryable = true + ) + } + + JumioScanStep.CAN_FINISH -> { + finishScanPartAndContinue() + } + + JumioScanStep.ADDON_SCAN_PART -> { + currentScanPart = currentCredential?.getAddonPart() + setUpScanView() + } + + JumioScanStep.DIGITAL_IDENTITY_VIEW -> { + setUpScanView() + } + + JumioScanStep.THIRD_PARTY_VERIFICATION -> { + navigationState.value = + AppNavigation.Loader(title = context.getString(R.string.verifying)) + } + } + } + + override fun onCleared() { + super.onCleared() + if (jumioController?.isComplete == false) { + jumioController?.stop() + } + } + + fun onConsentItemToggle(consentItem: JumioConsentItem, isChecked: Boolean) { + if (consentItem.type == JumioConsentType.ACTIVE) { + jumioController?.userConsented(consentItem, isChecked) + } + } + + fun onUiEvent(uiEvent: CustomUIEvent) { + Log.d(TAG, "onUiEvent $uiEvent") + when (uiEvent) { + is CustomUIEvent.StartClicked -> { + startWithFirstCredential() + } + is CustomUIEvent.CountrySelected -> { + selectedCountry = uiEvent.country + if (currentCredential is JumioIDCredential) { + val idCredential = currentCredential as JumioIDCredential + documentList.value = idCredential.getPhysicalDocumentsForCountry(selectedCountry) + + idCredential.getDigitalDocumentsForCountry(selectedCountry) + } + } + is CustomUIEvent.DocumentSelected -> { + (currentCredential as? JumioIDCredential)?.let { + it.setConfiguration(selectedCountry, uiEvent.document) + startScanPartWith(it.credentialParts.first()) + } + } + is CustomUIEvent.AcquireModeClicked -> { + (currentCredential as? JumioDocumentCredential)?.let { + it.setConfiguration(uiEvent.mode) + startScanPartWith(it.credentialParts.first()) + } + } + } + } + + private fun startWithFirstCredential() { + if (jumioController?.getUnconsentedItems()?.isNotEmpty() == true) { + Log.d(TAG, "User consent is missing") + return + } + Log.d(TAG, "User consented to all consent items") + try { + // cancel the credential here in case it is the first one.. + try { + currentCredential?.cancel() + } catch (e: Exception) { + // Current credential cannot be cancelled, ignore the error + Log.e(TAG, e.message ?: "credential cancel failed") + } + currentCredentialInfo = credentialInfoList.firstOrNull() + currentCredential = currentCredentialInfo?.let { jumioController?.start(it) } + setUpCredential() + } catch (e: IllegalArgumentException) { + // Current credential could not be started + Log.e(TAG, e.message ?: "credential start failed") + } catch (e: SDKNotConfiguredException) { + Log.e(TAG, e.message ?: "SDKNotConfiguredException") + } + } + + private fun setUpCredential() { + currentCredential?.let { + if (it.isConfigured) { + isNewCredentialStarted = true + startScanPartWith(it.credentialParts.first()) + return + } + } + + when (currentCredential) { + is JumioIDCredential -> { + Log.d(TAG, "setUpCredential JumioIDCredential") + isNewCredentialStarted = true + val idCredential = currentCredential as JumioIDCredential + countryList = idCredential.supportedCountries.sorted() + selectedCountry = idCredential.suggestedCountry ?: "" + documentList.value = idCredential.getPhysicalDocumentsForCountry(selectedCountry) + + idCredential.getDigitalDocumentsForCountry(selectedCountry) + navigationState.value = AppNavigation.SelectCountryAndDocument + } + is JumioDocumentCredential -> { + Log.d(TAG, "setUpCredential JumioDocumentCredential") + isNewCredentialStarted = true + navigationState.update { AppNavigation.AcquireMode } + } + is JumioFaceCredential -> { + Log.d(TAG, "setUpCredential JumioFaceCredential") + isNewCredentialStarted = true + currentCredential?.let { + startScanPartWith(it.credentialParts.first()) + } + } + } + } + + private fun startScanPartWith(credentialPart: JumioCredentialPart) { + // Init scan part and start scan + try { + try { + currentScanPart?.cancel() + } catch (e: Exception) { + // Current credential cannot be cancelled, ignore the error + Log.e(TAG, e.message ?: "scan part cancel failed") + } + currentCredentialPart = credentialPart + currentScanPart = currentCredential?.initScanPart(credentialPart, this) + currentScanPart?.start() + } catch (exception: Exception) { + // Invalid arguments on initializing the scan part + Log.e(TAG, "${exception.message}") + } + } + + private fun finishScanPartAndContinue() { + try { + currentScanPart?.finish() + currentScanPart = currentCredential?.getAddonPart() + if (currentScanPart == null) { + continueWithNextPart() + } else { + currentScanPart?.start() + } + } catch (exception: SDKNotConfiguredException) { + Log.e(TAG, "${exception.message}") + } catch (exception: IllegalArgumentException) { + Log.e(TAG, "${exception.message}") + } + } + + private fun continueWithNextPart() { + try { + if (currentCredential?.isComplete == true) { + currentCredential?.finish() + continueWithNextCredential() + return + } + val currentPart = currentCredentialPart ?: return + val availableParts = currentCredential?.credentialParts ?: return + + val nextIndex = availableParts.indexOf(currentPart) + 1 + if (nextIndex != 0 && availableParts.size > nextIndex) { + startScanPartWith(availableParts[nextIndex]) + } + } catch (exception: SDKNotConfiguredException) { + Log.e(TAG, "${exception.message}") + } catch (exception: IllegalArgumentException) { + Log.e(TAG, "${exception.message}") + } + } + + private fun continueWithNextCredential() { + if (currentCredentialInfo?.id == credentialInfoList.last().id) { + // Finish the controller and continue with upload view + currentCredential = null + navigationState.value = + AppNavigation.Loader(title = getApplication().applicationContext.getString(R.string.uploading)) + jumioController?.finish() + } else { + val nextIndex = (credentialInfoList.indexOfFirst { it.id == currentCredentialInfo?.id }).plus(1) + currentCredentialInfo = credentialInfoList[nextIndex] + currentCredential = currentCredentialInfo?.let { jumioController?.start(it) } + setUpCredential() + } + } + + private fun setUpScanView() = when (currentScanPart?.scanMode) { + JumioScanMode.WEB -> { + navigationState.value = AppNavigation.DigitalIdentity + } + JumioScanMode.FACE_IPROOV -> { + /*Not needed*/ + } + JumioScanMode.NFC -> { + navigationState.value = AppNavigation.NfcScan + } + else -> { + navigationState.value = AppNavigation.Scan + } + } + + fun onRetry() { + if (scanStepEvent.value == JumioScanStep.RETRY) { + retryReason?.let { + currentScanPart?.retry(it) + retryReason = null + } + } else { + jumioError?.let { + try { + jumioController?.retry(it) + navigationState.value = AppNavigation.Consent + } catch (exception: IllegalArgumentException) { + showError(exception.message) + } catch (exception: SDKNotConfiguredException) { + showError(exception.message) + } + } + } + } + + private fun showError(message: String?) { + Toast.makeText(getApplication(), message ?: "Unknown Error", Toast.LENGTH_LONG).show() + } + + fun finishController() { + try { + currentScanPart?.cancel() + jumioController?.cancel() + } catch (e: SDKNotConfiguredException) { + Log.e(TAG, e.message ?: "SDKNotConfiguredException") + } catch (e: IllegalArgumentException) { + Log.e(TAG, e.message ?: "IllegalArgumentException") + } + } + + fun skipAddonPart() { + cancelCurrentScanPart() + continueWithNextPart() + } + + fun cancelCurrentScanPart() { + try { + currentScanPart?.cancel() + currentScanPart = null + } catch (exception: SDKNotConfiguredException) { + Log.e(TAG, exception.message ?: "SDKNotConfiguredException") + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/ViewModelFactory.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/ViewModelFactory.kt new file mode 100644 index 00000000..ebf2ee84 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/viewModel/ViewModelFactory.kt @@ -0,0 +1,29 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.viewModel + +import android.app.Application +import androidx.lifecycle.AbstractSavedStateViewModelFactory +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.savedstate.SavedStateRegistryOwner +import com.jumio.sdk.enums.JumioDataCenter + +class ViewModelFactory( + owner: SavedStateRegistryOwner, + private val application: Application, + private val token: String, + private val dataCenter: JumioDataCenter, + private val customTheme: Int, +) : AbstractSavedStateViewModelFactory(owner, null) { + + @Suppress("UNCHECKED_CAST") + override fun create(key: String, modelClass: Class, handle: SavedStateHandle): T { + return CustomUIViewModel( + savedStateHandle = handle, + application = application, + token = token, + dataCenter = dataCenter, + customTheme = customTheme + ) as T + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/Button.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/Button.kt new file mode 100644 index 00000000..dbd96f13 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/Button.kt @@ -0,0 +1,112 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.atoms + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.FilterChip +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.jumio.sample.compose.theme.Primary +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing + +@Composable +fun PrimaryButton(title: String, modifier: Modifier = Modifier, enabled: Boolean = true, onClick: () -> Unit) { + Button( + onClick = { + onClick() + }, + modifier = modifier, + colors = ButtonDefaults.buttonColors(containerColor = Primary, contentColor = Color.White), + enabled = enabled + ) { + Text(text = title, style = MaterialTheme.typography.titleMedium) + } +} + +@Preview +@Composable +fun PrimaryButtonPreview() { + PrimaryButton( + title = "Start Custom UI", + onClick = { } + ) +} + +data class ToggleButtonState(val name: String, val isEnabled: Boolean) + +@Composable +fun ToggleButtonGroup(items: List, onSelected: (String) -> Unit) { + val toggleButtonList = remember { + mutableStateListOf( + *items.toTypedArray() + ) + } + + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier.padding(MaterialTheme.spacing.medium) + ) { + Row { + toggleButtonList.forEachIndexed { index, item -> + FilterChip( + selected = item.isEnabled, + onClick = { + toggleButtonList.forEachIndexed { i, toggleButtonState -> + toggleButtonList[i] = toggleButtonState.copy(isEnabled = i == index) + } + if (toggleButtonList[index].isEnabled) { + onSelected(item.name) + } + }, + label = { + Text( + text = item.name, + fontSize = 14.sp + ) + }, + shape = when (index) { + 0 -> RoundedCornerShape(topStart = MaterialTheme.spacing.medium, bottomStart = MaterialTheme.spacing.medium) + toggleButtonList.size - 1 -> RoundedCornerShape( + topEnd = MaterialTheme.spacing.medium, + bottomEnd = MaterialTheme.spacing.medium + ) + else -> RoundedCornerShape(0.dp) + }, + colors = androidx.compose.material3.FilterChipDefaults.filterChipColors( + selectedContainerColor = Primary, + selectedLabelColor = Color.White, + containerColor = MaterialTheme.colors.background, + labelColor = MaterialTheme.colors.label + ) + ) + } + } + } +} + +@Preview +@Composable +fun ToggleButtonGroupPreview() { + ToggleButtonGroup( + items = listOf( + ToggleButtonState("US", true), + ToggleButtonState("EU", false), + ToggleButtonState("SG", false) + ), + onSelected = {} + ) +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/DropDownMenuBox.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/DropDownMenuBox.kt new file mode 100644 index 00000000..94109952 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/DropDownMenuBox.kt @@ -0,0 +1,82 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.atoms + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.jumio.sample.compose.theme.colors + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DropDownMenu(items: Array, onSelected: (String) -> Unit) { + var expanded by remember { mutableStateOf(false) } + var selectedText by remember { mutableStateOf(items[0]) } + + Box( + modifier = Modifier + .fillMaxWidth() + ) { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + expanded = !expanded + }, + modifier = Modifier.fillMaxWidth() + ) { + TextField( + value = selectedText, + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth(), + colors = TextFieldDefaults.colors().copy( + cursorColor = MaterialTheme.colors.primary, + focusedIndicatorColor = MaterialTheme.colors.primary, + unfocusedIndicatorColor = MaterialTheme.colors.unFocusedIndicator, + focusedPlaceholderColor = MaterialTheme.colors.primary, + unfocusedPlaceholderColor = MaterialTheme.colors.unFocusedIndicator, + unfocusedTextColor = MaterialTheme.colors.unFocusedIndicator, + focusedTextColor = MaterialTheme.colors.unFocusedIndicator, + focusedTrailingIconColor = MaterialTheme.colors.primary, + unfocusedTrailingIconColor = MaterialTheme.colors.unFocusedIndicator + ) + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + items.forEach { item -> + DropdownMenuItem( + text = { Text(text = item) }, + onClick = { + selectedText = item + expanded = false + onSelected(item) + } + ) + } + } + } + } +} + +@Preview(showBackground = true, showSystemUi = true) +@Composable +fun DropDownMenu_Preview() { + DropDownMenu(items = arrayOf("Item 1", "Item 2", "Item 3"), onSelected = {}) +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/TopAppBar.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/TopAppBar.kt new file mode 100644 index 00000000..a203e40a --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/atoms/TopAppBar.kt @@ -0,0 +1,36 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.atoms + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import com.jumio.sample.compose.theme.Primary + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AppBar(title: String, onNavigationIconClick: () -> Unit) { + TopAppBar( + title = { + Text(text = title, style = MaterialTheme.typography.titleLarge) + }, + navigationIcon = { + IconButton(onClick = { + onNavigationIconClick() + }) { + Icon(imageVector = Icons.Filled.Menu, contentDescription = "Menu", tint = Color.White) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Primary, + titleContentColor = Color.White + ) + ) +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/molecules/NavigationDrawerMenu.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/molecules/NavigationDrawerMenu.kt new file mode 100644 index 00000000..9447e23b --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/molecules/NavigationDrawerMenu.kt @@ -0,0 +1,138 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.molecules + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalDrawerSheet +import androidx.compose.material3.NavigationDrawerItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sdk.JumioSDK + +@Composable +fun NavigationDrawerMenu(openLink: (String) -> Unit, cleanModels: () -> Unit) { + ModalDrawerSheet { + Text( + text = stringResource(id = R.string.menu_legal_information), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(MaterialTheme.spacing.medium) + ) + NavigationDrawerItem( + label = { + Text( + text = stringResource(id = R.string.menu_terms_of_use), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_info), + contentDescription = stringResource(id = R.string.menu_terms_of_use), + tint = MaterialTheme.colors.info + ) + }, + selected = false, + modifier = Modifier.padding(start = MaterialTheme.spacing.small), + onClick = { + openLink( + "https://www.jumio.com/legal-information/privacy-policy/jumio-showcase-app-privacy-terms/" + ) + } + ) + NavigationDrawerItem( + label = { + Text( + text = stringResource(id = R.string.menu_privacy_policy), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_info), + contentDescription = stringResource(id = R.string.menu_privacy_policy), + tint = MaterialTheme.colors.info + ) + }, + selected = false, + modifier = Modifier.padding(start = MaterialTheme.spacing.small), + onClick = { + openLink( + "https://www.jumio.com/legal-information/privacy-policy/jumio-showcase-app-privacy-terms/" + ) + } + ) + NavigationDrawerItem( + label = { + Text( + text = stringResource(id = R.string.menu_licenses), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_licenses), + contentDescription = stringResource(id = R.string.menu_licenses), + tint = Color.Black + ) + }, + selected = false, + modifier = Modifier.padding(start = MaterialTheme.spacing.small), + onClick = { + openLink("https://github.com/Jumio/mobile-sdk-android/tree/master/licenses") + } + ) + + HorizontalDivider() + + Text( + text = stringResource(id = R.string.menu_version), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(MaterialTheme.spacing.medium) + ) + NavigationDrawerItem( + label = { + Text(text = JumioSDK.version, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold) + }, + selected = false, + modifier = Modifier.padding(start = MaterialTheme.spacing.small), + onClick = { + openLink("https://github.com/Jumio/mobile-sdk-android/releases") + } + ) + + HorizontalDivider() + + Text( + text = stringResource(id = R.string.menu_advanced), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(MaterialTheme.spacing.medium) + ) + NavigationDrawerItem( + label = { + Text( + text = stringResource(id = R.string.clean_models), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + selected = false, + modifier = Modifier.padding(start = MaterialTheme.spacing.small), + onClick = { + cleanModels() + } + ) + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/navigation/AppNavigation.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/navigation/AppNavigation.kt new file mode 100644 index 00000000..46378b35 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/navigation/AppNavigation.kt @@ -0,0 +1,40 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.navigation + +import kotlinx.serialization.Serializable + +sealed class AppNavigation { + + @Serializable + data object SelectCountryAndDocument : AppNavigation() + + @Serializable + data object Consent : AppNavigation() + + @Serializable + data object Scan : AppNavigation() + + @Serializable + data object AcquireMode : AppNavigation() + + @Serializable + data object Confirmation : AppNavigation() + + @Serializable + data object Rejection : AppNavigation() + + @Serializable + data class Loader(val title: String) : AppNavigation() + + @Serializable + data class Error(val message: String, val isRetryable: Boolean) : AppNavigation() + + @Serializable + data object DigitalIdentity : AppNavigation() + + @Serializable + data object UploadFileHelp : AppNavigation() + + @Serializable + data object NfcScan : AppNavigation() +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/AcquireModeSelectionPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/AcquireModeSelectionPage.kt new file mode 100644 index 00000000..a0ea9960 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/AcquireModeSelectionPage.kt @@ -0,0 +1,91 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIEvent +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sdk.credentials.JumioDocumentCredential +import com.jumio.sdk.enums.JumioAcquireMode + +/** + * Shows the acquire mode [JumioAcquireMode] options for a [JumioDocumentCredential] + * [JumioAcquireMode.FILE] to select the pdf file + * [JumioAcquireMode.CAMERA] to take a photo + */ +@Composable +fun AcquireModeSelectionPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier, onClose: () -> Unit) { + Box { + Column( + modifier = modifier + .padding(vertical = MaterialTheme.spacing.medium) + ) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + Text( + text = stringResource(id = R.string.select_acquire_mode), + color = MaterialTheme.colors.label, + modifier = Modifier.padding(horizontal = MaterialTheme.spacing.medium) + ) + (viewModel.currentCredential as? JumioDocumentCredential)?.let { + LazyColumn(modifier = Modifier.padding(start = MaterialTheme.spacing.large)) { + items(it.availableAcquireModes) { + Column { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding( + top = MaterialTheme.spacing.small, + bottom = MaterialTheme.spacing.small, + end = MaterialTheme.spacing.medium + ) + .clickable { + viewModel.onUiEvent(CustomUIEvent.AcquireModeClicked(it)) + } + ) { + Text( + text = it.name, + color = MaterialTheme.colors.label, + modifier = Modifier.weight(1f) + ) + Icon( + imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, + contentDescription = stringResource(id = R.string.camera), + tint = MaterialTheme.colors.primary + ) + } + HorizontalDivider() + } + } + } + } + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ConfirmationPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ConfirmationPage.kt new file mode 100644 index 00000000..92013242 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ConfirmationPage.kt @@ -0,0 +1,83 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.AndroidView +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.views.JumioConfirmationView + +/** + * Shows the list of scanned parts with options of retake or confirm the scan + */ +@Composable +fun ConfirmationPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier, onClose: () -> Unit) { + BackHandler { + viewModel.confirmationHandler.retake() + } + Column(modifier = modifier.padding(vertical = MaterialTheme.spacing.medium).fillMaxSize()) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + viewModel.currentScanPart?.let { jumioScanPart -> + viewModel.confirmationHandler.attach(jumioScanPart) + LazyColumn(modifier = Modifier.padding(all = MaterialTheme.spacing.medium).weight(0.9f)) { + items(viewModel.confirmationHandler.parts) { + val confirmationView = JumioConfirmationView(LocalContext.current) + viewModel.confirmationHandler.renderPart(it, confirmationView) + AndroidView(factory = { + confirmationView + }) + } + } + } + Row( + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth().weight(0.1f) + ) { + PrimaryButton( + title = stringResource(id = R.string.retake), + onClick = { + viewModel.confirmationHandler.retake() + } + ) + Spacer(modifier = Modifier.width(MaterialTheme.spacing.large)) + PrimaryButton( + title = stringResource(id = R.string.confirm), + onClick = { + viewModel.confirmationHandler.confirm() + } + ) + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ConsentPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ConsentPage.kt new file mode 100644 index 00000000..cd9487d9 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ConsentPage.kt @@ -0,0 +1,149 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import android.graphics.Color +import android.text.method.LinkMovementMethod +import android.widget.TextView +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CheckboxDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.jumio.sample.R +import com.jumio.sample.compose.theme.Typography +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIEvent +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.enums.JumioConsentType + +/** + * Consent Page to show the list of credentials to scan and the list of privacy policy to accept + * and on click of start button would trigger the start of the workflow for first credential + */ +@Composable +fun ConsentPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier, onClose: () -> Unit) { + val loaderState by viewModel.consentPageLoaderState.collectAsStateWithLifecycle() + Column(modifier = modifier.fillMaxSize()) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Filled.Close, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + Spacer(modifier = modifier.height(MaterialTheme.spacing.extraLarge)) + Text( + text = stringResource(id = R.string.workflow_consists), + style = Typography.titleLarge, + color = MaterialTheme.colors.label, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MaterialTheme.spacing.large) + ) + Spacer(modifier = modifier.height(MaterialTheme.spacing.medium)) + if (loaderState) { + Text( + text = stringResource(id = R.string.loading), + style = Typography.titleMedium, + color = MaterialTheme.colors.label, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MaterialTheme.spacing.superLarge) + ) + } + + LazyColumn { + items(viewModel.credentialInfoList) { info -> + Text( + text = "• capture your " + info.category.name, + style = Typography.titleMedium, + color = MaterialTheme.colors.label, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MaterialTheme.spacing.superLarge) + ) + } + } + + Spacer(modifier = Modifier.weight(1f)) + + LazyColumn { + items(viewModel.consentItems) { consentItem -> + val checked = remember { mutableStateOf(false) } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MaterialTheme.spacing.medium) + ) { + if (consentItem.type == JumioConsentType.ACTIVE) { + Checkbox( + checked = checked.value, + onCheckedChange = { + checked.value = it + viewModel.onConsentItemToggle(consentItem, it) + }, + colors = CheckboxDefaults.colors().copy( + checkedCheckmarkColor = MaterialTheme.colors.primary, + checkedBoxColor = MaterialTheme.colors.checkBox, + checkedBorderColor = MaterialTheme.colors.primary + ) + ) + } + + val textColor = MaterialTheme.colors.label + AndroidView(factory = { context -> + TextView(context).apply { + text = consentItem.spannedTextWithLinkColor(Color.BLUE) + setTextColor(textColor.toArgb()) + textSize = 16f + movementMethod = LinkMovementMethod.getInstance() + } + }) + } + } + } + + Spacer(modifier = modifier.height(MaterialTheme.spacing.superLarge)) + + val titleId = if (loaderState) { + R.string.loading + } else { + R.string.start + } + PrimaryButton( + title = stringResource(id = titleId), + modifier = Modifier.fillMaxWidth().padding(horizontal = MaterialTheme.spacing.medium), + enabled = !loaderState + ) { + viewModel.onUiEvent(CustomUIEvent.StartClicked) + } + Spacer(modifier = modifier.height(MaterialTheme.spacing.medium)) + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/CountryAndDocumentSelectionPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/CountryAndDocumentSelectionPage.kt new file mode 100644 index 00000000..bb35bdf7 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/CountryAndDocumentSelectionPage.kt @@ -0,0 +1,180 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.jumio.sample.R +import com.jumio.sample.compose.extension.getName +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIEvent +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sdk.document.JumioDocument + +/** + * Shows the list of countries and documents. Selecting each country will show the list of documents for that country. + * and selecting the document would start the first scanPart + * + */ +@Composable +fun CountryAndDocumentSelectionPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier, onClose: () -> Unit) { + val documentList by viewModel.documentList.collectAsStateWithLifecycle() + Column(modifier = modifier.fillMaxSize()) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + SelectCountry( + countryList = viewModel.countryList, + viewModel.selectedCountry, + modifier = Modifier.weight(1f).padding(horizontal = MaterialTheme.spacing.medium) + ) { + viewModel.onUiEvent(CustomUIEvent.CountrySelected(it)) + } + Spacer(modifier = Modifier.height(MaterialTheme.spacing.large)) + SelectDocument( + documentList = documentList, + modifier = Modifier.weight(1f).padding(horizontal = MaterialTheme.spacing.medium) + ) { + viewModel.onUiEvent(CustomUIEvent.DocumentSelected(it)) + } + } +} + +@Composable +fun SelectCountry( + countryList: List, + default: String, + modifier: Modifier = Modifier, + onSelect: (String) -> Unit, +) { + val defaultCountry = rememberSaveable { mutableStateOf(default) } + Column(modifier = modifier) { + Text( + text = stringResource(id = R.string.select_country), + color = MaterialTheme.colors.label + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.small)) + LazyColumn(modifier = Modifier.padding(start = MaterialTheme.spacing.medium)) { + items(countryList) { + Column { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding( + top = MaterialTheme.spacing.small, + bottom = MaterialTheme.spacing.small, + end = MaterialTheme.spacing.medium + ) + .clickable { + onSelect(it) + defaultCountry.value = it + } + ) { + Text( + text = it, + color = MaterialTheme.colors.label, + modifier = Modifier.weight(1f) + ) + if (defaultCountry.value == it) { + Icon( + imageVector = Icons.Filled.Check, + contentDescription = stringResource(id = R.string.select_country), + tint = MaterialTheme.colors.primary + ) + } + } + HorizontalDivider() + } + } + } + } +} + +@Composable +fun SelectDocument( + documentList: List, + modifier: Modifier = Modifier, + onSelect: (JumioDocument) -> Unit, +) { + Column(modifier = modifier) { + Text( + text = stringResource(id = R.string.select_document), + color = MaterialTheme.colors.label + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.small)) + LazyColumn(modifier = Modifier.padding(start = MaterialTheme.spacing.medium)) { + items(documentList) { + Column { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding( + top = MaterialTheme.spacing.small, + bottom = MaterialTheme.spacing.small, + end = MaterialTheme.spacing.medium + ) + .clickable { + onSelect(it) + } + ) { + Text( + text = it.getName(), + color = MaterialTheme.colors.label, + modifier = Modifier.weight(1f) + ) + Icon( + imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, + contentDescription = stringResource(id = R.string.select_document), + tint = MaterialTheme.colors.primary + ) + } + HorizontalDivider() + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun SelectCountryPreview() { + SelectCountry(countryList = listOf("India", "USA", "UK"), "USA", onSelect = {}) +} + +@Preview(showBackground = true) +@Composable +fun SelectDocumentPreview() { + SelectDocument(documentList = listOf(), onSelect = {}) +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/DigitalIdentityPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/DigitalIdentityPage.kt new file mode 100644 index 00000000..24fd1c62 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/DigitalIdentityPage.kt @@ -0,0 +1,29 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sdk.views.JumioDigitalIdentityView + +/** + * shows the DigitalIdentityView to scan the digital identities + */ +@Composable +fun DigitalIdentityPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier) { + Box(modifier = modifier.fillMaxSize()) { + AndroidView( + factory = { + val digitalIdentityView = JumioDigitalIdentityView(it) + viewModel.currentScanPart?.let { scanPart -> + digitalIdentityView.attach(scanPart) + } + digitalIdentityView + }, + modifier = Modifier.fillMaxSize() + ) + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ErrorPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ErrorPage.kt new file mode 100644 index 00000000..ff607b71 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ErrorPage.kt @@ -0,0 +1,78 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.views.atoms.PrimaryButton + +/** + * Shows error message with retry option on [JumioError] or [JumioScanStep.RETRY] + */ +@Composable +fun ErrorPage( + message: String, + isRetryable: Boolean, + onRetryClick: () -> Unit, + onClose: () -> Unit, + modifier: Modifier = Modifier, +) { + BackHandler { + if (isRetryable) { + onRetryClick() + } else { + onClose() + } + } + Column(modifier = modifier.padding(vertical = MaterialTheme.spacing.medium)) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Filled.Close, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + Spacer(modifier = modifier.height(MaterialTheme.spacing.extraLarge)) + Column( + modifier = Modifier.fillMaxSize().padding(horizontal = MaterialTheme.spacing.medium), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = message, + color = MaterialTheme.colors.error, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + PrimaryButton( + title = stringResource(id = if (isRetryable) R.string.retry else R.string.cancel).uppercase() + ) { + if (isRetryable) { + onRetryClick() + } else { + onClose() + } + } + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/HelpPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/HelpPage.kt new file mode 100644 index 00000000..e58951ff --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/HelpPage.kt @@ -0,0 +1,91 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import com.jumio.sample.R +import com.jumio.sample.compose.theme.Typography +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.views.JumioFileAttacher + +/** + * Help Page to show the requirement details to upload the file + */ +@Composable +fun UploadFileHelpPage( + requirements: JumioFileAttacher.JumioFileRequirements, + onSelectFile: () -> Unit, + onBack: () -> Unit, + modifier: Modifier = Modifier, +) { + Column(modifier = modifier.padding(vertical = MaterialTheme.spacing.medium)) { + IconButton(onClick = { + onBack() + }) { + Icon( + imageVector = Icons.AutoMirrored.Filled.KeyboardArrowLeft, + contentDescription = stringResource(id = R.string.back), + tint = MaterialTheme.colors.primary + ) + } + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.fillMaxWidth().weight(1f) + ) { + Text( + text = stringResource(R.string.requirement), + color = MaterialTheme.colors.label, + textAlign = TextAlign.Center, + style = Typography.titleLarge + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.large)) + Text( + text = stringResource( + com.jumio.defaultui.R.string.jumio_dv_upload_tips_file_size, + "%dMB".format( + requirements.maxFileSize / (1024 * 1024) + ) + ), + color = MaterialTheme.colors.label, + textAlign = TextAlign.Center + ) + Text( + text = stringResource(com.jumio.defaultui.R.string.jumio_dv_upload_tips_page_size, requirements.pdfMaxPages), + color = MaterialTheme.colors.label, + textAlign = TextAlign.Center + ) + Text( + text = stringResource(com.jumio.defaultui.R.string.jumio_dv_upload_tips_protected), + color = MaterialTheme.colors.label, + textAlign = TextAlign.Center + ) + } + Row(horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.fillMaxWidth()) { + PrimaryButton( + title = stringResource(id = R.string.select_file), + onClick = { + onSelectFile() + } + ) + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/HomePage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/HomePage.kt new file mode 100644 index 00000000..836aab15 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/HomePage.kt @@ -0,0 +1,127 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.tooling.preview.Preview +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sample.compose.views.atoms.ToggleButtonGroup +import com.jumio.sample.compose.views.atoms.ToggleButtonState + +/** + * A page to enter the token for the workflow with option to select the data center and + * start Custom UI or Default UI + */ +@Composable +fun HomePage( + modifier: Modifier, + onCustomUiClick: (String, String) -> Unit, + onDefaultUiClick: (String, String) -> Unit, +) { + var token by remember { + mutableStateOf(TextFieldValue("")) + } + val datacenter = listOf( + ToggleButtonState("US", true), + ToggleButtonState("EU", false), + ToggleButtonState("SG", false) + ) + var selectedDatacenter by remember { + mutableStateOf(datacenter[0].name) + } + + Column( + modifier = modifier + .padding(MaterialTheme.spacing.medium), + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.CenterHorizontally + ) { + TextField( + value = token, + onValueChange = { + token = it + }, + label = { + Text(text = stringResource(id = R.string.token)) + }, + placeholder = { + Text(text = stringResource(id = R.string.enter_token)) + }, + trailingIcon = { + if (token.text.isNotEmpty()) { + IconButton(onClick = { token = TextFieldValue("") }) { + Icon(Icons.Default.Clear, contentDescription = "clear token") + } + } + }, + singleLine = true, + modifier = Modifier.fillMaxWidth(), + colors = TextFieldDefaults.colors().copy( + cursorColor = MaterialTheme.colors.primary, + focusedIndicatorColor = MaterialTheme.colors.primary, + unfocusedIndicatorColor = MaterialTheme.colors.unFocusedIndicator, + focusedPlaceholderColor = MaterialTheme.colors.primary, + unfocusedPlaceholderColor = MaterialTheme.colors.unFocusedIndicator, + unfocusedTextColor = MaterialTheme.colors.unFocusedIndicator, + focusedTextColor = MaterialTheme.colors.unFocusedIndicator, + focusedTrailingIconColor = MaterialTheme.colors.primary, + unfocusedTrailingIconColor = MaterialTheme.colors.unFocusedIndicator, + focusedLabelColor = MaterialTheme.colors.primary, + unfocusedLabelColor = MaterialTheme.colors.unFocusedIndicator + ) + ) + ToggleButtonGroup( + items = datacenter, + onSelected = { + selectedDatacenter = it + } + ) + PrimaryButton( + title = stringResource(id = R.string.start_custom_ui_title).uppercase(), + modifier = Modifier.fillMaxWidth() + ) { + onCustomUiClick(token.text, selectedDatacenter) + } + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + PrimaryButton( + title = stringResource(id = R.string.start_default_ui_title).uppercase(), + modifier = Modifier.fillMaxWidth() + ) { + onDefaultUiClick(token.text, selectedDatacenter) + } + } +} + +@Preview +@Composable +fun HomePagePreview() { + HomePage( + modifier = Modifier, + onCustomUiClick = { _, _ -> }, + onDefaultUiClick = { _, _ -> } + ) +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/LoaderPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/LoaderPage.kt new file mode 100644 index 00000000..1ebf4a9a --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/LoaderPage.kt @@ -0,0 +1,48 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing + +/** + * Loader page to show during different scan steps such as verifying, processing and preparing + */ +@Composable +fun LoaderPage(title: String, modifier: Modifier = Modifier) { + Column( + modifier = modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + CircularProgressIndicator( + modifier = Modifier.width(48.dp), + color = MaterialTheme.colorScheme.secondary, + trackColor = MaterialTheme.colors.primary + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + Text( + text = title, + color = MaterialTheme.colors.label + ) + } +} + +@Preview(showBackground = true, showSystemUi = true) +@Composable +fun LoaderPreview() { + LoaderPage(title = "Loading...") +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/NfcScanPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/NfcScanPage.kt new file mode 100644 index 00000000..114467d1 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/NfcScanPage.kt @@ -0,0 +1,225 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProgressIndicatorDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.compose.LocalLifecycleOwner +import com.jumio.sample.R +import com.jumio.sample.compose.theme.Typography +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.dimensions +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.enums.JumioScanStep +import com.jumio.sdk.enums.JumioScanUpdate +import com.jumio.sdk.views.JumioAnimationView +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +@Composable +fun NfcScanPage( + viewModel: CustomUIViewModel, + onClose: () -> Unit, + onBackPress: () -> Unit, + modifier: Modifier = Modifier, +) { + BackHandler { + onBackPress() + } + val context = LocalContext.current + val title = remember { mutableStateOf(context.getString(com.jumio.defaultui.R.string.jumio_nfc_header_start)) } + val description = + remember { mutableStateOf(context.getString(com.jumio.defaultui.R.string.jumio_nfc_description_start_other)) } + val progress = remember { mutableIntStateOf(0) } + val showProgress = remember { mutableStateOf(false) } + val showIvStatus = remember { mutableStateOf(false) } + val showSkipButton = remember { mutableStateOf(true) } + val lifecycleOwner = LocalLifecycleOwner.current + val scope = rememberCoroutineScope() + val animatedProgress by animateFloatAsState( + targetValue = progress.intValue / 100f, + animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, + label = "" + ) + + DisposableEffect(lifecycleOwner) { + val scanUpdateJob = scope.launch { + viewModel.scanUpdateEvent.collectLatest { + it?.let { (scanUpdate, data) -> + when (scanUpdate) { + JumioScanUpdate.NFC_EXTRACTION_STARTED -> { + showIvStatus.value = false + showSkipButton.value = false + showProgress.value = true + title.value = context.getString(com.jumio.defaultui.R.string.jumio_nfc_header_extracting) + description.value = "" + progress.intValue = 0 + } + JumioScanUpdate.NFC_EXTRACTION_PROGRESS -> { + showProgress.value = true + showIvStatus.value = false + progress.intValue = data as? Int ?: 0 + } + JumioScanUpdate.NFC_EXTRACTION_FINISHED -> { + showIvStatus.value = true + showProgress.value = false + } + else -> { + } + } + } + } + } + + val scanStepJob = scope.launch { + viewModel.scanStepEvent.collectLatest { scanStep -> + when (scanStep) { + JumioScanStep.ADDON_SCAN_PART -> { + showIvStatus.value = false + showSkipButton.value = true + showProgress.value = false + title.value = context.getString(com.jumio.defaultui.R.string.jumio_nfc_header_start) + description.value = context.getString(com.jumio.defaultui.R.string.jumio_nfc_description_start_other) + } + else -> {} + } + } + } + + onDispose { + scanUpdateJob.cancel() + scanStepJob.cancel() + } + } + + Column( + modifier = modifier + .fillMaxSize() + .padding(horizontal = MaterialTheme.spacing.medium) + .padding(vertical = MaterialTheme.spacing.medium) + ) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Filled.Close, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + Spacer(modifier = modifier.height(MaterialTheme.spacing.large)) + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = title.value, + style = Typography.headlineLarge, + color = MaterialTheme.colors.label, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + AndroidView( + factory = { + JumioAnimationView(it).apply { + viewModel.currentScanPart?.getHelpAnimation(this) + } + }, + modifier = Modifier.height(MaterialTheme.dimensions.animationViewSize).fillMaxWidth() + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + Text( + text = description.value, + style = Typography.titleMedium, + color = MaterialTheme.colors.label, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + + if (showProgress.value) { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator( + progress = { animatedProgress }, + modifier = Modifier.width(MaterialTheme.spacing.superLarge) + .height(MaterialTheme.spacing.superLarge), + color = MaterialTheme.colorScheme.secondary, + trackColor = MaterialTheme.colors.primary + ) + Text( + text = "${progress.intValue}%", + color = MaterialTheme.colors.label, + modifier = Modifier.padding(MaterialTheme.spacing.medium) + ) + } + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + Text( + text = stringResource(id = com.jumio.defaultui.R.string.jumio_nfc_description_extracting), + style = Typography.titleMedium, + color = MaterialTheme.colors.label, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + } + + if (showIvStatus.value) { + Icon( + imageVector = Icons.Filled.CheckCircle, + contentDescription = stringResource(id = R.string.nfc_scan_finished), + tint = MaterialTheme.colors.primary + ) + } + } + + Spacer(modifier = Modifier.weight(1f)) + if (showSkipButton.value) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + PrimaryButton( + title = stringResource(id = com.jumio.defaultui.R.string.jumio_nfc_button_skip), + onClick = { + viewModel.skipAddonPart() + } + ) + } + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/RejectionPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/RejectionPage.kt new file mode 100644 index 00000000..7593da0f --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/RejectionPage.kt @@ -0,0 +1,94 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import android.widget.LinearLayout +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.AndroidView +import com.jumio.commons.utils.dpToPx +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.views.JumioRejectView + +/** + * Shows the list of rejected scanned parts and option to retake the scan + */ +@Composable +fun RejectionPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier, onClose: () -> Unit) { + BackHandler { + viewModel.rejectHandler.retake() + } + Box { + Column( + modifier = modifier + .padding(all = MaterialTheme.spacing.medium) + ) { + IconButton(onClick = { + onClose() + }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = stringResource(id = R.string.close), + tint = MaterialTheme.colors.primary + ) + } + LazyColumn( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.small), + horizontalAlignment = Alignment.CenterHorizontally, + contentPadding = PaddingValues( + horizontal = MaterialTheme.spacing.medium, + vertical = MaterialTheme.spacing.small + ) + ) { + items(viewModel.rejectHandler.parts) { part -> + AndroidView(factory = { context -> + val rejectionView = JumioRejectView(context).apply { + cornerRadius = 16.dpToPx(context) + layoutParams = LinearLayout.LayoutParams( + 300.dpToPx(context), + 300.dpToPx(context) + ) + } + viewModel.rejectHandler.renderPart(part, rejectionView) + rejectionView + }) + } + } + } + Column { + Spacer(modifier = Modifier.weight(1f)) + Row(horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.fillMaxWidth()) { + PrimaryButton( + title = stringResource(id = R.string.reject), + onClick = { + viewModel.rejectHandler.retake() + } + ) + } + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ResultPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ResultPage.kt new file mode 100644 index 00000000..cb0fea7d --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ResultPage.kt @@ -0,0 +1,125 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import com.jumio.core.result.JumioDocumentResult +import com.jumio.sample.R +import com.jumio.sample.compose.theme.Typography +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.result.JumioCredentialResult +import com.jumio.sdk.result.JumioFaceResult +import com.jumio.sdk.result.JumioIDResult +import com.jumio.sdk.result.JumioResult + +/** + * Shows the result of all scans such as ID, Face or Document. + */ +@Composable +fun ResultPage(jumioResult: JumioResult, modifier: Modifier = Modifier, onDismiss: () -> Unit) { + Column( + modifier = modifier + .padding(horizontal = MaterialTheme.spacing.medium) + .padding(bottom = MaterialTheme.spacing.medium) + .verticalScroll(rememberScrollState()) + ) { + Text( + text = stringResource(id = R.string.scan_finish_msg), + style = Typography.headlineMedium, + color = MaterialTheme.colors.label, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + if (jumioResult.isSuccess) { + jumioResult.credentialInfos?.forEach { + when (val result = jumioResult.getResult(it)) { + is JumioIDResult -> { + TextPrimaryLabel(label = stringResource(id = R.string.id)) + Column(modifier = Modifier.padding(start = MaterialTheme.spacing.medium)) { + val firstName = result.firstName + val lastName = result.lastName + if (firstName != null && lastName != null) { + TextSecondaryLabel(label = "Name: ${firstName.uppercase()} ${lastName.uppercase()}") + } + result.country?.let { country -> + TextSecondaryLabel(label = "Country: ${country.uppercase()}") + } + } + } + is JumioFaceResult -> { + TextPrimaryLabel(label = stringResource(id = R.string.face)) + val faceResult = when (result.passed) { + true -> "Yes" + false -> "No" + else -> "N/A" + } + TextSecondaryLabel(label = "Passed: $faceResult") + } + is JumioDocumentResult -> { + result.extractionMode?.name?.let { name -> + TextPrimaryLabel(label = stringResource(id = R.string.document)) + TextPrimaryLabel(label = "Mode: $name") + } + } + is JumioCredentialResult -> { + result.extractionMode?.name?.let { name -> + TextPrimaryLabel(label = stringResource(id = R.string.credentials)) + TextPrimaryLabel(label = "Mode: $name") + } + } + } + } + } else { + jumioResult.error?.let { error -> + TextPrimaryLabel(label = stringResource(id = R.string.error)) + Column(modifier = Modifier.padding(start = MaterialTheme.spacing.medium)) { + TextSecondaryLabel(label = "Code: ${error.code}") + TextSecondaryLabel(label = "Message: ${error.message}") + } + } + } + Spacer(modifier = Modifier.height(MaterialTheme.spacing.medium)) + PrimaryButton( + title = stringResource(id = R.string.done).uppercase(), + modifier = Modifier.fillMaxWidth() + ) { + onDismiss() + } + } +} + +@Composable +fun TextSecondaryLabel(label: String) { + Text( + text = label, + color = MaterialTheme.colors.label, + modifier = Modifier.padding(all = MaterialTheme.spacing.medium) + ) + HorizontalDivider() +} + +@Composable +fun TextPrimaryLabel(label: String) { + Text( + text = label, + style = Typography.labelLarge, + color = MaterialTheme.colors.label, + modifier = Modifier.padding(all = MaterialTheme.spacing.medium) + ) + HorizontalDivider() +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ScanPage.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ScanPage.kt new file mode 100644 index 00000000..b1be4f40 --- /dev/null +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/compose/views/pages/ScanPage.kt @@ -0,0 +1,220 @@ +// Copyright 2024 Jumio Corporation, all rights reserved. +package com.jumio.sample.compose.views.pages + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.layout +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.jumio.sample.R +import com.jumio.sample.compose.theme.colors +import com.jumio.sample.compose.theme.spacing +import com.jumio.sample.compose.viewModel.CustomUIViewModel +import com.jumio.sample.compose.views.atoms.PrimaryButton +import com.jumio.sdk.enums.JumioScanStep +import com.jumio.sdk.enums.JumioScanUpdate +import com.jumio.sdk.views.JumioScanView +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * A scanPage to show the JumioScanview to display the camera with various controls such as extraction method, fallback, flash and + * manual capture + */ + +@Composable +fun ScanPage(viewModel: CustomUIViewModel, modifier: Modifier = Modifier) { + val scanAlignment = viewModel.scanAlignmentState.collectAsStateWithLifecycle() + val flipDocument = viewModel.flipDocument.collectAsStateWithLifecycle() + val lifecycleOwner = LocalLifecycleOwner.current + val scope = rememberCoroutineScope() + val scanView = remember { mutableStateOf(null) } + val takePicture = remember { mutableStateOf(false) } + val switchCamera = remember { mutableStateOf(false) } + val toggleFlash = remember { mutableStateOf(false) } + val startFallback = remember { mutableStateOf(false) } + + DisposableEffect(lifecycleOwner) { + val scanStepJob = scope.launch { + viewModel.scanStepEvent.collectLatest { scanStep -> + when (scanStep) { + JumioScanStep.SCAN_VIEW -> { + toggleFlash.value = false + switchCamera.value = false + takePicture.value = false + startFallback.value = viewModel.currentScanPart?.hasFallback == true + } + JumioScanStep.CAN_FINISH -> { + scanView.value?.let { + lifecycleOwner.lifecycle.removeObserver(it) + } + } + JumioScanStep.NEXT_PART -> { + startFallback.value = viewModel.currentScanPart?.hasFallback == true + scanView.value?.let { + takePicture.value = it.isShutterEnabled + it.extraction = false + delay(3000) + it.extraction = true + } + } + else -> {} + } + } + } + + val scanUpdateJob = scope.launch { + viewModel.scanUpdateEvent.collectLatest { scanUpdate -> + scanUpdate?.let { (jumioScanUpdate, _) -> + when (jumioScanUpdate) { + JumioScanUpdate.CAMERA_AVAILABLE -> { + viewModel.scanUpdateEvent.value = null + scanView.value?.let { + toggleFlash.value = it.hasFlash + switchCamera.value = it.hasMultipleCameras + takePicture.value = it.isShutterEnabled + } + } + JumioScanUpdate.FALLBACK -> { + viewModel.scanUpdateEvent.value = null + startFallback.value = viewModel.currentScanPart?.hasFallback == true + scanView.value?.let { + takePicture.value = it.isShutterEnabled + } + } + else -> { + } + } + } + } + } + + onDispose { + scanView.value?.let { jumioScanView -> + lifecycleOwner.lifecycle.removeObserver(jumioScanView) + } + scanStepJob.cancel() + scanUpdateJob.cancel() + } + } + + Box(modifier = modifier.fillMaxSize()) { + AndroidView( + factory = { + JumioScanView(it).apply { + invalidate() + requestLayout() + viewModel.currentScanPart?.let { scanPart -> + attach(scanPart) + } + lifecycleOwner.lifecycle.addObserver(this) + }.also { view -> + scanView.value = view + } + }, + modifier = Modifier.fillMaxSize() + ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxSize() + .padding(horizontal = MaterialTheme.spacing.medium, vertical = MaterialTheme.spacing.superLarge) + ) { + Row(horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.fillMaxWidth()) { + viewModel.currentScanPart?.scanMode?.let { + PrimaryButton( + title = it.name, + onClick = {} + ) + } + Spacer(modifier = Modifier.width(MaterialTheme.spacing.large)) + PrimaryButton( + title = stringResource(id = R.string.fallback), + enabled = startFallback.value, + onClick = { + viewModel.currentScanPart?.fallback() + } + ) + } + + Spacer(modifier = Modifier.height(MaterialTheme.spacing.large)) + + Text( + text = flipDocument.value, + color = MaterialTheme.colors.primary, + style = MaterialTheme.typography.labelMedium + ) + + Text( + text = scanAlignment.value, + color = MaterialTheme.colors.label + ) + + Spacer(modifier = Modifier.weight(1f)) + + PrimaryButton( + title = stringResource(id = R.string.take), + enabled = takePicture.value, + modifier = Modifier.visibility(takePicture.value), + onClick = { + scanView.value?.takePicture() + } + ) + Spacer(modifier = Modifier.height(MaterialTheme.spacing.large)) + Row(horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.fillMaxWidth()) { + PrimaryButton( + title = stringResource(id = R.string.camera), + enabled = switchCamera.value, + modifier = Modifier.visibility(switchCamera.value), + onClick = { + scanView.value?.switchCamera() + } + ) + Spacer(modifier = Modifier.width(MaterialTheme.spacing.large)) + PrimaryButton( + title = stringResource(id = R.string.flash), + enabled = toggleFlash.value, + modifier = Modifier.visibility(toggleFlash.value), + onClick = { + scanView.value?.let { + it.flash = !it.flash + } + } + ) + } + } + } +} + +private fun Modifier.visibility(visible: Boolean): Modifier { + return layout { measurable, constraints -> + val placeable = measurable.measure(constraints) + + layout(placeable.width, placeable.height) { + if (visible) { + // place this item in the original position + placeable.placeRelative(0, 0) + } + } + } +} diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/CustomUiActivity.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/CustomUiActivity.kt similarity index 97% rename from sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/CustomUiActivity.kt rename to sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/CustomUiActivity.kt index eb82819b..32329aee 100644 --- a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/CustomUiActivity.kt +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/CustomUiActivity.kt @@ -1,5 +1,5 @@ // Copyright 2023 Jumio Corporation, all rights reserved. -package com.jumio.sample.customui +package com.jumio.sample.xml import android.annotation.SuppressLint import android.app.Activity @@ -31,10 +31,10 @@ import com.jumio.commons.log.Log import com.jumio.commons.utils.dpToPx import com.jumio.defaultui.JumioActivity import com.jumio.sample.R -import com.jumio.sample.customui.adapter.CustomConsentAdapter -import com.jumio.sample.customui.adapter.CustomCountryAdapter -import com.jumio.sample.customui.adapter.CustomDocumentAdapter import com.jumio.sample.databinding.ActivityCustomuiBinding +import com.jumio.sample.xml.adapter.CustomConsentAdapter +import com.jumio.sample.xml.adapter.CustomCountryAdapter +import com.jumio.sample.xml.adapter.CustomDocumentAdapter import com.jumio.sdk.JumioSDK import com.jumio.sdk.consent.JumioConsentItem import com.jumio.sdk.controller.JumioController @@ -318,11 +318,13 @@ class CustomUiActivity : } binding.credentialCancel.setOnClickListener { - credential?.cancel() - updateIcon(binding.credentialLayout, credential?.isComplete == true) - credential = null - hideView(binding.credentialControls) - hideViewsAfter(binding.credentialControls) + catchAndShow { + credential?.cancel() + updateIcon(binding.credentialLayout, credential?.isComplete == true) + credential = null + hideView(binding.credentialControls) + hideViewsAfter(binding.credentialControls) + } } } @@ -365,9 +367,11 @@ class CustomUiActivity : private fun initControllerUi() { binding.controllerCancel.setOnClickListener { - jumioController.cancel() - hideViewsAfter(binding.controllerControls) - showView(binding.loadingIndicator) + catchAndShow { + jumioController.cancel() + hideViewsAfter(binding.controllerControls) + showView(binding.loadingIndicator) + } } binding.controllerFinish.setOnClickListener { @@ -453,7 +457,9 @@ class CustomUiActivity : if (jumioController.isComplete) { jumioController.finish() } else { - jumioController.cancel() + catchAndShow { + jumioController.cancel() + } } } else { super.onBackPressed() @@ -598,12 +604,17 @@ class CustomUiActivity : JumioScanUpdate.NFC_EXTRACTION_PROGRESS -> log("NFC Extraction progress $data") JumioScanUpdate.NFC_EXTRACTION_FINISHED -> log("NFC Extraction finished") JumioScanUpdate.CENTER_ID -> log("Center your ID") - JumioScanUpdate.CENTER_FACE -> log("Center your face") - JumioScanUpdate.LEVEL_EYES_AND_DEVICE -> log("Hold your device at eye level") JumioScanUpdate.HOLD_STILL -> log("Hold still...") JumioScanUpdate.HOLD_STRAIGHT -> log("Hold straight") JumioScanUpdate.MOVE_CLOSER -> log("Move closer") JumioScanUpdate.TOO_CLOSE -> log("Too close") + JumioScanUpdate.MOVE_FACE_INTO_FRAME -> log("Put your face in the frame") + JumioScanUpdate.CENTER_FACE -> log("Center your face") + JumioScanUpdate.LEVEL_EYES_AND_DEVICE -> log("Hold your device at eye level") + JumioScanUpdate.TILT_FACE_UP -> log("Tilt your face up") + JumioScanUpdate.TILT_FACE_DOWN -> log("Tilt your face down") + JumioScanUpdate.TILT_FACE_LEFT -> log("Tilt your face left") + JumioScanUpdate.TILT_FACE_RIGHT -> log("Tilt your face right") JumioScanUpdate.MOVE_FACE_CLOSER -> log("Move face closer") JumioScanUpdate.FACE_TOO_CLOSE -> log("Face too close") JumioScanUpdate.NEXT_POSITION -> log("Move face to next position") @@ -895,7 +906,6 @@ class CustomUiActivity : showView(binding.scanPartControls) val activeScanPart = scanPart ?: return - if (activeScanPart.scanMode == JumioScanMode.WEB) { hideView(binding.inlineScanLayout) showView(binding.digitalIdentityView) diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/MainActivity.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/MainActivity.kt similarity index 98% rename from sample/JumioMobileSample/src/main/java/com/jumio/sample/MainActivity.kt rename to sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/MainActivity.kt index 4a0d9c1e..378a28be 100644 --- a/sample/JumioMobileSample/src/main/java/com/jumio/sample/MainActivity.kt +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/MainActivity.kt @@ -1,5 +1,5 @@ // Copyright 2023 Jumio Corporation, all rights reserved. -package com.jumio.sample +package com.jumio.sample.xml import android.content.Intent import android.net.Uri @@ -19,7 +19,7 @@ import androidx.core.view.GravityCompat import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import com.jumio.defaultui.JumioActivity -import com.jumio.sample.customui.CustomUiActivity +import com.jumio.sample.R import com.jumio.sample.databinding.ActivityMainBinding import com.jumio.sdk.JumioSDK import com.jumio.sdk.enums.JumioDataCenter diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomConsentAdapter.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomConsentAdapter.kt similarity index 98% rename from sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomConsentAdapter.kt rename to sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomConsentAdapter.kt index 0b4c7b2b..592a054b 100644 --- a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomConsentAdapter.kt +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomConsentAdapter.kt @@ -1,5 +1,5 @@ // Copyright 2023 Jumio Corporation, all rights reserved. -package com.jumio.sample.customui.adapter +package com.jumio.sample.xml.adapter import android.text.method.LinkMovementMethod import android.view.LayoutInflater diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomCountryAdapter.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomCountryAdapter.kt similarity index 90% rename from sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomCountryAdapter.kt rename to sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomCountryAdapter.kt index 7471935b..1caeba4d 100644 --- a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomCountryAdapter.kt +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomCountryAdapter.kt @@ -1,5 +1,5 @@ // Copyright 2023 Jumio Corporation, all rights reserved. -package com.jumio.sample.customui.adapter +package com.jumio.sample.xml.adapter import android.content.Context import android.widget.ArrayAdapter diff --git a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomDocumentAdapter.kt b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomDocumentAdapter.kt similarity index 94% rename from sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomDocumentAdapter.kt rename to sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomDocumentAdapter.kt index 4dd3b305..51618091 100644 --- a/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomDocumentAdapter.kt +++ b/sample/JumioMobileSample/src/main/java/com/jumio/sample/xml/adapter/CustomDocumentAdapter.kt @@ -1,5 +1,5 @@ // Copyright 2023 Jumio Corporation, all rights reserved. -package com.jumio.sample.customui.adapter +package com.jumio.sample.xml.adapter import android.content.Context import android.widget.ArrayAdapter diff --git a/sample/JumioMobileSample/src/main/res/layout/activity_main.xml b/sample/JumioMobileSample/src/main/res/layout/activity_main.xml index add184b5..8474d440 100644 --- a/sample/JumioMobileSample/src/main/res/layout/activity_main.xml +++ b/sample/JumioMobileSample/src/main/res/layout/activity_main.xml @@ -3,19 +3,18 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" - android:layout_height="match_parent" - android:fitsSystemWindows="true"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> diff --git a/sample/JumioMobileSample/src/main/res/values-af/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-af/strings-jumio-sdk.xml index 376e5a76..9cb08276 100644 --- a/sample/JumioMobileSample/src/main/res/values-af/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-af/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Maak asseblief seker u is aanlyn Daar was \'n netwerkkommunikasieprobleem Toegang tot kamera is gedeaktiveer - Skandering is tans nie beskikbaar nie; kontak asseblief die bystandspan + Skandering is tans nie beskikbaar nie; kontak asseblief die bystandspan Sessie het verstryk Digitale ID Bestuurderslisensie @@ -33,6 +33,8 @@ Neem \'n foto Verander van kamera Besig om biometriese data te ontleed + Om met die oplaai voort te gaan, maak seker dat jy ’n digitale bestuurslisensie-PDF van die amptelike regeringstoepassing afgelaai het [({Carteira Digital de Trânsito})] + Laai ’n CNH Digital PDF op Kanselleer Probeer weer Ons sal jou na dokumentseleksie terughelp. @@ -59,6 +61,7 @@ Maak seker dat alle besonderhede op u dokument leesbaar is Die beeld is te onduidelik om te verifieer Beelde moet weer geneem word + Maak seker jy het ’n digitale bestuurslisensie-PDF van die amptelike regeringstoepassing afgelaai [({Carteira Digital de Trânsito})] Probeer asseblief weer met ’n beeld in kleur Die beeld is ’n swart-en-wit-fotokopie Die beeld is blykbaar ’n kleurfotokopie @@ -138,6 +141,7 @@ Neem \'n selfie Plaas u gesig in die ovaal raam en druk die sluiterknoppie Gesigverifiëring + Brasilië CNH Digital PDF Deursoek land Kies land van uitreiking Ander formaat @@ -148,10 +152,18 @@ Kontroleer land van uitreiking Kies die soort dokument Ondersteunde dokumente + Bly in die middel + Hou stil + Hou regop + Beweeg terug Sit u gesig in die raam - Daarsy! Kom ons neem nog ’n skoot - Te naby + Kom ons doen nog een + Laat sak + Kantel links + Kantel regs + Lig op Kom nader + Skandering voltooi Ons moet jou gesig skandeer om te bevestig dat jy ’n regte persoon is. Besig om te laai Huppel @@ -170,6 +182,7 @@ Die app kan dalk die kamera se flits gebruik Begin Verifiëring Hierdie proses is ontwerp om jou identiteit te verifieer en jou teen identiteitsdiefstal te beskerm + Probeer asb. weer Oplaai was suksesvol Besig om op te laai --> diff --git a/sample/JumioMobileSample/src/main/res/values-ar/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-ar/strings-jumio-sdk.xml index 41a0112a..20d8c713 100644 --- a/sample/JumioMobileSample/src/main/res/values-ar/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-ar/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ يُرجى التحقق من أنك متصل بالإنترنت واجهنا مشكلة في الاتصال بالشبكة تم تعطيل الوصول إلى الكاميرا - المسح غير متاح في الوقت الحالي، يُرجى الاتصال بفريق الدعم + المسح غير متاح في الوقت الحالي، يُرجى الاتصال بفريق الدعم انتهت صلاحية الجلسة الهوية الرقمية رخصة القيادة @@ -33,6 +33,8 @@ التقاط صورة تبديل الكاميرا تحليل البيانات البيومترية + للمتابعة في التحميل، تأكد من تنزيل نسخة PDF من رخصة القيادة الرقمية من تطبيق الحكومة الرسمي [({Carteira Digital de Trânsito})] + تحميل ملف CNH Digital بتنسيق PDF إلغاء حاول مجددًا ستتم إعادتك إلى تحديد المستندات. @@ -59,6 +61,7 @@ تأكد من أن جميع التفاصيل الموجودة في مستندك قابلة للقراءة الصورة ضبابية جدًا بحيث لا يمكن التحقق منها يجب إعادة التقاط الصور + تأكد من تنزيل نسخة PDF من رخصة القيادة الرقمية من تطبيق الحكومة الرسمي [({Carteira Digital de Trânsito})] يُرجى المحاولة مرة أخرى باستخدام صورة ملونة الصورة عبارة عن نسخة بالأبيض والأسود يبدو أن الصورة عبارة عن نسخة ملونة @@ -138,6 +141,7 @@ التقاط صورة ذاتية ضع وجهك في الإطار البيضاوي واضغط على زر الغالق التحقق من الوجه + PDF البرازيل CNH الرقمية بحث عن البلد حدد بلد الإصدار صيغه آخرى @@ -148,10 +152,18 @@ تحقق من بلد الإصدار تحديد نوع المستند الوثائق المدعومة + حافظ على التمركز + حافظ على ثباتك + حافظ على الاستقامة + تحرّك بعيدًا ضع وجهك في الإطار - فهمت! فلنحاول مرة أخرى - قريب جدًا + لنجري مسحًا آخر + إمالة إلى الأسفل + إمالة إلى اليسار + إمالة إلى اليمين + إمالة إلى الأعلى اقترب + اكتمل المسح نريد إجراء مسح لوجهك للتحقق من أنك شخص حقيقي. جار التحميل تخطى @@ -170,6 +182,7 @@ قد يستخدم التطبيق فلاش الكاميرا ابدأ التحقق تم تصميم هذه العملية للتحقق من هويتك وحمايتك من سرقة الهوية + حاول مرة اخرى تحميل ناجح تحميل --> diff --git a/sample/JumioMobileSample/src/main/res/values-b+sr+Latn/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-b+sr+Latn/strings-jumio-sdk.xml index d8a0a53c..22041a7a 100644 --- a/sample/JumioMobileSample/src/main/res/values-b+sr+Latn/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-b+sr+Latn/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Proverite da li ste na mreži Naišli smo na problem mrežne komunikacije Pristup kameri onemogućen - Skeniranje trenutno nije dostupno, obratite se timu za podršku + Skeniranje trenutno nije dostupno, obratite se timu za podršku Sesija je istekla Digitalni ID Vozačka dozvola @@ -33,6 +33,8 @@ Fotofrafiši Prebaci kameru Analiziranje biometrijskih podataka + Da biste nastavili sa otpremanjem, uverite se da ste preuzeli digitalnu vozačku dozvolu u PDF-u sa zvanične vladine aplikacije [({Carteira Digital de Trânsito})] + Otpremite CNH Digital PDF Otkaži Pokušaj ponovo Bićete vraćeni na izbor dokumenata. @@ -59,6 +61,7 @@ Uverite se da su svi detalji u vašem dokumentu čitljivi Slika je previše mutna za verifikaciju Slike moraju biti pono fotografisane + Uverite se da ste preuzeli digitalnu vozačku dozvolu u PDF-u sa zvanične vladine aplikacije [({Carteira Digital de Trânsito})] Pokušajte ponovo sa slikom u boji Slika je crno-bela fotokopija Izgleda da je slika fotokopija u boji @@ -138,6 +141,7 @@ Snimite selfi Poravnajte lice u ovalnom okviru i pritisnite okidač Verifikacija lica + Brazil CNH Digital PDF Pretraži zemlju Izaberite zemlju izdavanja Drugi format @@ -148,10 +152,18 @@ Proverite zemlju izdavanja Izaberite tip dokumenta Podržani dokumenti + Držite se u sredini + Budite mirni + Držite glavu uspravno + Sklonite se Stavite svoje lice u okvir - Razumem! Napravimo još jedan snimak - Preblizu + Napravimo još jedan snimak + Pomerite se nadole + Okrenite se ulevo + Okrenite se udesno + Pomerite se nagore Približite se + Skeniranje je završeno Moramo da vam skeniramo lice da bismo potvrdili da ste stvarna osoba. Učitavanje Preskoči @@ -170,6 +182,7 @@ Aplikacija može da koristi blic kamere Počni verifikaciju Ovaj proces je dizajniran da potvrdi vaš identitet i zaštiti vas od krađe identiteta + Pokušajte ponovo Otpremanje je uspešno Otpremanje --> diff --git a/sample/JumioMobileSample/src/main/res/values-bg/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-bg/strings-jumio-sdk.xml index e21e0504..fbe6af96 100644 --- a/sample/JumioMobileSample/src/main/res/values-bg/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-bg/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Проверете дали сте онлайн Възникна проблем с мрежовата комуникация Достъпът до камерата е деактивиран - В момента сканирането не е достъпно, свържете се с екипа по поддръжка + В момента сканирането не е достъпно, свържете се с екипа по поддръжка Сесията е изтекла Цифрова самоличност Шофьорска книжка @@ -33,6 +33,8 @@ Заснемане на снимка Превключване на камерата Анализиране на биометричните данни + За да продължите с прикачването на файл, уверете се, че сте свалили CNH Digital в PDF формат от официалния сайт на правителството [({Carteira Digital de Trânsito})] + Прикачете PDF на CNH Digital Отмяна Опитайте отново Ще се върнете обратно към избора на документ. @@ -59,6 +61,7 @@ Уверете се, че всички данни в документа ви са четливи. Изображението е твърде неясно Изображенията трябва да се заснемат отново + Уверете се, че сте свалили дигиталната шофьорска книжа в PDF формат от официалния сайт на правителството [({Carteira Digital de Trânsito})] Опитайте отново с цветно изображение Изображението е черно-бяло фотокопие Изображението изглежда е цветно фотокопие @@ -138,6 +141,7 @@ Заснемане на селфи Позиционирайте лицето си в рамката и натиснете бутона за снимка Проверка на лицето + Бразилски CNH Digital PDF Търсене на държава Изберете издаваща държава Друг формат @@ -148,10 +152,18 @@ Изберете издаваща държава Изберете тип документ Поддържани документи + Стойте в средата + Стойте неподвижно + Дръжте главата изправена + Отдалечете се малко Позиционирайте лицето си в рамката - Готово! Нека направим още един опит за снимка - Твърде близо сте + Нека направим още едно заснемане + Наведете надолу + Наклонете наляво + Наклонете надясно + Повдигнете нагоре Приближете се + Сканирането завърши Трябва да направим снимка на лицето ви, за да потвърдим, че сте истински човек. Зареждане Пропуснете @@ -168,8 +180,9 @@ Използвай валиден документ Използвайте валиден документ за самоличност, издаден от държавна институция Приложението може да използва светкавицата на камерата - Начало на удостоверяването + Започнете верификация Целта на процеса е да потвърди самоличността ти и да те защити от кражба на самоличност + Опитайте отново Качването е успешно Качване --> diff --git a/sample/JumioMobileSample/src/main/res/values-cs/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-cs/strings-jumio-sdk.xml index d03cf711..ee56a128 100644 --- a/sample/JumioMobileSample/src/main/res/values-cs/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-cs/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Zkontrolujte, jestli jste online Při síťové komunikaci došlo k problému. Přístup ke kameře zamítnut - Skenování není v tuto chvíli k dispozici, obraťte se na tým podpory + Skenování není v tuto chvíli k dispozici, obraťte se na tým podpory Relace vypršela Digitální ID Řidičský průkaz @@ -33,6 +33,8 @@ Pořídit fotografii Přepnout fotoaparát Analyzují se biometrické údaje… + Pokud chcete pokračovat v nahrávání, ujistěte se, že jste si stáhli digitální řidičský průkaz ve formátu PDF z oficiální vládní aplikace [({Carteira Digital de Trânsito})] + Nahrát digitální soubor PDF společnosti CNH Zrušit Zkusit znovu Budete přesměrováni zpět k výběru dokumentu. @@ -59,6 +61,7 @@ Zkontrolujte, zda jsou veškeré detaily ve vašem dokumentu čitelné Obrázek je příliš rozmazaný, než aby mohl být ověřen Snímky musí být pořízeny znovu + Ujistěte se, že jste si stáhli digitální řidičský průkaz ve formátu PDF z oficiální vládní aplikace [({Carteira Digital de Trânsito})] Zkuste to znovu s barevným obrázkem Obrázek je černobílá fotokopie Obrázek vypadá jako barevná fotokopie @@ -138,6 +141,7 @@ Pořiďte selfie Zarovnejte svou tvář s oválným rámečkem a stiskněte tlačítko závěrky Ověření pomocí obličeje + Brazilské CNH Digital PDF Hledat stát Vyberte zemi vydání Jiný formát @@ -148,10 +152,18 @@ Zkontrolujte zemi vydání Vyberte typ dokumentu Podporované dokumenty + Držte se uprostřed + Zůstaňte v klidu + Držte vzpřímeně + Vzdalte se Umístěte obličej do rámečku - Mám to! Proveďme nyní další pokus - Příliš blízko + Pojďme udělat další fotku + Nakloňte dolů + Nakloňte doleva + Nakloňte doprava + Nakloňte nahoru Pojďte blíž + Skenování dokončeno Musíme pořídit sken vašeho obličeje, abychom si mohli ověřit, že jste skutečná osoba. Načítá se… Přeskočit @@ -170,6 +182,7 @@ Aplikace může používat blesk fotoaparátu Zahájit ověřování Tento proces je navržen tak, aby bylo možné ověřit vaši totožnost a ochránit vás před krádeží identity + Zkuste to znovu Nahrání proběhlo úspěšně. Nahrávání --> diff --git a/sample/JumioMobileSample/src/main/res/values-da/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-da/strings-jumio-sdk.xml index f490513b..52cc0e52 100644 --- a/sample/JumioMobileSample/src/main/res/values-da/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-da/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Kontroller, at du er online Der er opstået et problem med netværksforbindelsen Kameraadgang deaktiveret - Scanning er ikke tilgængelig på dette tidspunkt. Kontakt kundesupport + Scanning er ikke tilgængelig på dette tidspunkt. Kontakt kundesupport Sessionen er udløbet Digitalt ID Kørekort @@ -33,6 +33,8 @@ Tag et billede Skift kamera Analyserer biometriske data + For at fortsætte med din upload skal du have downloadet et digitalt kørekort i PDF-format fra myndighedernes officielle program [({Carteira Digital de Trânsito})] + Upload CNH Digital som PDF Annuller Prøv igen Du bliver sendt tilbage til valg af dokument. @@ -59,6 +61,7 @@ Sørg for, at alle detaljer i dokumentet er læsbare Billedet er for uskarpt til at blive kontrolleret Billederne skal tages igen + Sørg for, at du har downloadet et digitalt kørekort i PDF-format fra myndighedernes officielle program [({Carteira Digital de Trânsito})] Prøv igen med et farvebillede Billedet er sort/hvidt Billedet ser ud til at være et farvefoto @@ -138,6 +141,7 @@ Tag en selfie Anbring dit ansigt i den ovale ramme, og tryk på udløserknappen Ansigtsverifikation + Brasilien CNH Digital PDF Søg land Vælg udstedelsesland Andet format @@ -148,10 +152,18 @@ Kontroller udstedelsesland Vælg ID-type Understøttede dokumenter + Stå i midten + Stå helt stille + Kig lige ud + Ryk tilbage Anbring dit ansigt i rammen - OK! Lad os tage et andet billede - For tæt på + Lad os lave en ny scanning + Kig nedad + Hæld mod venstre + Hæld mod højre + Kig opad Ryk tættere på + Scanning afsluttet Vi er nødt til at scanne dit ansigt for at kunne bekræfte, at du er et menneske. Indlæser Springe @@ -170,6 +182,7 @@ Appen bruger muligvis kameraets blitz Start bekræftelse Denne proces er designet til at bekræfte din identitet og beskytte dig mod identitetstyveri + Prøv venligst igen Upload gennemført Uploader --> diff --git a/sample/JumioMobileSample/src/main/res/values-de/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-de/strings-jumio-sdk.xml index bb6d05c5..3ba7c244 100644 --- a/sample/JumioMobileSample/src/main/res/values-de/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-de/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Bitte prüfen Sie, ob Sie online sind Es ist ein Verbindungsproblem aufgetreten Kamerazugriff ist deaktiviert - Scannen derzeit nicht verfügbar, bitte kontaktieren Sie das Support-Team + Scannen derzeit nicht verfügbar, bitte kontaktieren Sie das Support-Team Sitzung abgelaufen Digitale ID Führerschein @@ -33,6 +33,8 @@ Foto aufnehmen Kamera wechseln Biometrie-Daten werden analysiert + Um mit dem Hochladen fortzufahren, achten Sie darauf, dass Sie ein PDF des digitalen Führerscheins aus der offiziellen Regierungsanwendung [({Carteira Digital de Trânsito})] heruntergeladen haben. + Eine CNH Digital-PDF hochladen Beenden Erneut versuchen Sie kehren zur Dokumentauswahl zurück. @@ -59,6 +61,7 @@ Stellen Sie sicher, dass alle Informationen auf Ihrem Dokument lesbar sind. Das Bild ist zu verschwommen, um überprüft zu werden Bilder müssen erneut aufgenommen werden + Achten Sie darauf, dass Sie ein PDF des digitalen Führerscheins aus der offiziellen Regierungsanwendung [({Carteira Digital de Trânsito})] heruntergeladen haben. Versuchen Sie es bitte noch einmal mit einem Farbfoto Bei dem Bild handelt es sich um eine Schwarz-Weiß-Fotokopie Bei dem Bild scheint es sich um eine Farbfotokopie zu handeln @@ -76,7 +79,7 @@ Machen Sie ein Foto von der Vorderseite Ihres Dokuments Die Vorderseite Ihres Dokuments fehlt Das Bild Ihres Dokuments zeigt nicht die für die Verifizierung erforderlichen Informationen an - Verwenden Sie einen gültigen, amtlichen Ausweis. + Verwenden Sie einen gültigen, amtlichen Ausweis Decken Sie den Ausweis nicht mit Ihrer Hand ab Stellen Sie sicher, dass Sie das gesamte Dokument erfassen Das Bild ist keine gültige Identifizierung @@ -138,6 +141,7 @@ Selfie aufnehmen Richten Sie Ihr Gesicht im ovalen Rahmen aus und drücken Sie dann auf den Auslöser Gesichtserkennung + Brasilien CNH Digital PDF Land suchen Ausstellungsland auswählen Anderes Format @@ -148,10 +152,18 @@ Ausstellungsland prüfen Dokumenttyp auswählen Unterstützte Dokumente + Mittig bleiben + Halten Sie still + Gerade bleiben + Etwas weiter weg Bewegen Sie Ihr Gesicht in den Rahmen - Geschafft! Machen wir ein weiteres Foto - Zu nahe + Scannen wir noch einmal + Nach unten neigen + Nach links neigen + Nach rechts neigen + Nach oben neigen Näher kommen + Scannen abgeschlossen Wir müssen Ihr Gesicht scannen, um zu verifizieren, dass Sie wirklich eine Person sind. Lädt Überspringen @@ -163,13 +175,14 @@ Reisepass positionieren Ergebnis wird überprüft Starten - Suchen Sie eine gut beleuchtete Oberfläche. + Suchen Sie eine gut beleuchtete Oberfläche Machen Sie sich bereit für ein Selfie. Verwenden Sie ein gültiges Dokument. - Verwenden Sie einen gültigen, amtlichen Ausweis. + Verwenden Sie einen gültigen, amtlichen Ausweis Die App verwendet möglicherweise den Kamerablitz - Ausweisprüfung starten + Start der Verifizierung Dieser Prozess dient dazu, Ihre Identität zu bestätigen und Sie vor Identitätsdiebstahl zu schützen + Erneut versuchen Upload erfolgreich Hochladen --> diff --git a/sample/JumioMobileSample/src/main/res/values-el/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-el/strings-jumio-sdk.xml index 5a73737c..af36eec5 100644 --- a/sample/JumioMobileSample/src/main/res/values-el/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-el/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Ελέγξτε εάν είστε συνδεδεμένοι Αντιμετωπίσαμε πρόβλημα επικοινωνίας δικτύου Η πρόσβαση στην κάμερα είναι απενεργοποιημένη - Η σάρωση δεν είναι διαθέσιμη αυτήν τη στιγμή, επικοινωνήστε με την ομάδα υποστήριξης + Η σάρωση δεν είναι διαθέσιμη αυτήν τη στιγμή, επικοινωνήστε με την ομάδα υποστήριξης Η περίοδος λειτουργίας έληξε Ψηφιακή ταυτότητα Δίπλωμα οδήγησης @@ -33,6 +33,8 @@ Λήψη φωτογραφίας Εναλλαγή κάμερας Ανάλυση βιομετρικών δεδομένων + Για να προχωρήσετε στη μεταφόρτωση, βεβαιωθείτε ότι έχετε πραγματοποιήσει λήψη ψηφιακής άδειας οδήγησης σε PDF από την επίσημη κρατική εφαρμογή [({Carteira Digital de Trânsito})] + Μεταφόρτωση CNH Digital PDF Ακύρωση Δοκιμάστε ξανά Θα επιστρέψετε στην επιλογή εγγράφου. @@ -59,6 +61,7 @@ Βεβαιωθείτε ότι όλες οι λεπτομέρειες στο έγγραφό σας είναι ευανάγνωστες. Η εικόνα είναι πολύ θολή για να επαληθευτεί Απαιτείται επανάληψη λήψης των εικόνων + Βεβαιωθείτε ότι έχετε πραγματοποιήσει λήψη Ψηφιακής άδειας οδήγησης σε PDF από την επίσημη κρατική εφαρμογή [({Carteira Digital de Trânsito})] Δοκιμάστε ξανά με μια έγχρωμη εικόνα Η εικόνα είναι ασπρόμαυρο φωτοαντίγραφο Η εικόνα φαίνεται να είναι έγχρωμο φωτοαντίιγραφο @@ -138,6 +141,7 @@ Τραβήξτε μια σέλφι Ευθυγραμμίστε το πρόσωπό σας στο οβάλ πλαίσιο και πιέστε το κουμπί του κλείστρου Επαλήθευση προσώπου + Βραζιλία CNH Digital PDF Αναζήτηση χώρας Επιλέξτε χώρα έκδοσης Άλλη μορφή @@ -148,10 +152,18 @@ Ελέγξτε τη χώρα έκδοσης Επιλέξτε τύπο εγγράφου Υποστηριζόμενα έγγραφα + Μείνετε στο κέντρο + Μείνετε ακίνητοι + Μείνετε σε όρθια θέση + Απομακρυνθείτε Τοποθετήστε το πρόσωπό σας στο πλαίσιο - Εντάξει! Ας τραβήξουμε άλλη μια φωτογραφία - Πολύ κοντά + Ας κάνουμε άλλη μία σάρωση + Γείρετε προς τα κάτω + Γείρετε προς τα αριστερά + Γείρετε προς τα δεξιά + Γείρετε προς τα πάνω Ελάτε πιο κοντά + Η σάρωση ολοκληρώθηκε Πρέπει να κάνουμε σάρωση του προσώπου σας για να επαληθεύσουμε ότι είστε πραγματικό άτομο. Φόρτωση Παραλείπω @@ -168,8 +180,9 @@ Χρησιμοποιήστε ένα έγκυρο έγγραφο Χρησιμοποιήστε μια έγκυρη ταυτότητα από κρατική αρχή έκδοσης Η εφαρμογή ενδέχεται να χρησιμοποιήσει το φλας της κάμερας - Έναρξη επαλήθευσης + Ξεκινήστε την επαλήθευση Αυτή η διαδικασία έχει σχεδιαστεί για την επιβεβαίωση της ταυτότητάς σας και την προστασία σας από πλαστοπροσωπία + Δοκιμάστε ξανά Η φόρτωση ήταν επιτυχής Μεταφόρτωση --> diff --git a/sample/JumioMobileSample/src/main/res/values-es/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-es/strings-jumio-sdk.xml index bda415b8..6be5f0b5 100644 --- a/sample/JumioMobileSample/src/main/res/values-es/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-es/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Compruebe que está conectado Hemos detectado un problema de comunicación de red Acceso a la cámara inactivo - La opción de escanear no está disponible en este momento. Póngase en contacto con el equipo de soporte + La opción de escanear no está disponible en este momento. Póngase en contacto con el equipo de soporte La sesión ha caducado Identificación digital Permiso de conducir @@ -33,6 +33,8 @@ Hacer una foto Cambiar cámara Analizando datos biométricos + Para continuar con el proceso, asegurate de haber descargado el PDF de la licencia de conducir digital de la aplicación oficial del gobierno [({Carteira Digital de Trânsito})] + Subir el PDF de CNH Digital Cancelar Volver a intentarlo Se le conducirá de nuevo a la selección de documentos. @@ -59,6 +61,7 @@ Asegúrese de que todos los detalles en su documento sean legibles La imagen es demasiado borrosa para ser verificada Las imágenes se deben volver a tomar + Asegurate que has descargado el PDF de la licencia de conducir digital de la aplicación oficial del gobierno [({Carteira Digital de Trânsito})] Inténtelo de nuevo con una imagen en color La imagen es una fotocopia en blanco y negro La imagen parece ser una fotocopia en color @@ -138,6 +141,7 @@ Hacerse un selfie Enmarque la cara dentro del óvalo y pulse el botón de obturación Verificación facial + PDF de CNH Digital de Brasil Buscar país Seleccione el país de expedición Otro formato @@ -148,10 +152,18 @@ Compruebe el país de expedición Seleccione el tipo de documento Documentos admitidos + Mantente centrado/a + No se mueva + Mantente erguido/a + Aléjate Ubique la cara dentro del marco - ¡Entendido! Intentémoslo de nuevo. - Demasiado cerca + ¡Hagamos otro escaneo! + Inclínate hacia abajo + Inclínate hacia la izquierda + Inclínate hacia la derecha + Inclínate hacia arriba Acérquese + Escaneo completado Necesitamos escanear su rostro para verificar que es una persona real. Cargando Omitir @@ -170,6 +182,7 @@ La aplicación puede utilizar el flash de la cámara Iniciar verificación Este proceso está diseñado para verificar su identidad y protegerlo del robo de identidad + Inténtelo de nuevo Carga correcta Cargando --> diff --git a/sample/JumioMobileSample/src/main/res/values-et/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-et/strings-jumio-sdk.xml index 2bfc93ec..40a10abe 100644 --- a/sample/JumioMobileSample/src/main/res/values-et/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-et/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Kontrollige, et teil oleks võrguühendus Meil on tekkinud võrgusuhtluse probleem Juurdepääs kaamerale on keelatud - Skannimine pole praegu saadaval, võtke ühendust kasutajatoega + Skannimine pole praegu saadaval, võtke ühendust kasutajatoega Sessioon on aegunud Digi-ID Juhiluba @@ -33,6 +33,8 @@ Pildista Lülituge teisele kaamerale Biomeetriliste andmete analüüsimine + Üleslaadimisega jätkamiseks veenduge, et olete ametlikust riiklikust rakendusest alla laadinud digitaalse juhiloa [({Carteira Digital de Trânsito})] PDF-i. + Laadige üles PDF-vormingus CNH Digital Tühista Proovige uuesti Teid suunatakse tagasi dokumendi valimisse. @@ -59,6 +61,7 @@ Veenduge, et kõik doumendil olevad andmed oleksid loetavad Foto on tuvastamiseks liiga hägune Pildid tuleb uuesti teha + Veenduge, et olete ametlikust valitsuse rakendusest alla laadinud PDF-vormingus digitaalse juhiloa [({Carteira Digital de Trânsito})]. Palun proovige uuesti värvipildiga Pilt on mustvalge fotokoopia Näib, et pilt on värviline fotokoopia @@ -138,6 +141,7 @@ Tehke selfie Kontrollige, et teie nägu oleks ovaalses raamis ja vajutage pildistamisnuppu Näotuvastus + Brasiilia CNH Digital PDF Riigi otsing Valige dokumendi väljastanud riik Muu vorming @@ -148,10 +152,18 @@ Valige dokumendi väljastanud riik Valige dokumendi tüüp Toetatud dokumendid + Hoia nägu keskel + Olge paigal + Hoia pea sirgelt + Liigu kaugemale Asetage oma nägu raami sisse - Sain aru! Teeme veel ühe võtte - Liiga lähedal + Teeme veel ühe võtte + Kalluta alla + Kalluta vasakule + Kalluta paremale + Kalluta üles Liigutage lähemale + Skannimine on lõpetatud Peame skannima Sinu näo kinnitamaks, et oled inimene, mitte robot. Laadimine Vahele jätma @@ -168,8 +180,9 @@ Kasutage kehtivat dokumenti Kasutage riigiasutuse väljastatud dokumenti Rakendus võib kasutada kaamera välku - Alustage kinnitamist + Alusta kontrollimist Selle protsessi eesmärk on teie isiku kinnitamine ja teie identiteedivarguse eest kaitsmine + Palun proovi uuesti Üleslaadimine õnnestus Üleslaadimine --> diff --git a/sample/JumioMobileSample/src/main/res/values-fi/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-fi/strings-jumio-sdk.xml index d594a4fa..bcb207ee 100644 --- a/sample/JumioMobileSample/src/main/res/values-fi/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-fi/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Varmista, että olet yhteydessä internetiin Verkkoyhteyden toiminnassa on jokin ongelma Kamera on poistettu käytöstä - Skannaus ei ole tällä hetkellä käytettävissä. Ota yhteyttä tukeen + Skannaus ei ole tällä hetkellä käytettävissä. Ota yhteyttä tukeen Istunto vanhentunut Digitaalinen henkilöllisyystodistus Ajokortti @@ -33,6 +33,8 @@ Ota kuva Vaihda kameraa Biometrisia tietoja analysoidaan + Varmista, että olet ladannut digitaalisen ajokortin PDF-tiedoston valtion virallisesta sovelluksesta [({Carteira Digital de Trânsito})], jotta voit jatkaa lähettämistä + Lähetä CNH Digital -PDF Peruuta Yritä uudelleen Sinut siiretään takaisin asiakirjan valintaan. @@ -59,6 +61,7 @@ Varmista, että kaikki asiakirjan tiedot ovat luettavissa. Kuva on liian epäselvä vahvistamista varten Ota kuvat uudelleen + Varmista, että olet ladannut digitaalisen ajokortin PDF-tiedoston valtion virallisesta sovelluksesta [({Carteira Digital de Trânsito})] Yritä uudelleen värikuvalla. Kuva on mustavalkoinen valokopio Kuva näyttää olevan värillinen valokopio @@ -138,6 +141,7 @@ Ota selfie Kehystä kasvosi ensin soikeaan kehykseen ja paina sitten laukaisinpainiketta Kasvotunnistus + Brasilian CNH Digital PDF Hae maa Valitse myöntäjämaa Muu muoto @@ -148,10 +152,18 @@ Tarkista myöntäjämaa Valitse asiakirjan tyyppi Tuetut dokumentit + Pysy keskellä + Ole liikkumatta + Pysy suorassa + Siirry poispäin Sovita kasvosi kehykseen - Selvä! Otetaanpa toinen kuva - Liian lähellä + Skannataan vielä kerran + Kallista alas + Kallista vasemmalle + Kallista oikealle + Kallista ylös Siirry lähemmäs + Skannaus valmis Meidän täytyy skannata kasvosi vahvistaaksemme, että olet oikea henkilö. Ladataan Ohita @@ -168,8 +180,9 @@ Käytä voimassa olevaa asiakirjaa Käytä voimassa olevaa virallista henkilöllisyystodistusta Sovellus saattaa käyttää kameran salamaa - Aloita vahvistus + Aloita varmennus Tämän prosessin tarkoituksena on vahvistaa henkilöllisyytesi ja suojata sinua identiteettivarkauksilta + Yritä uudelleen Lataaminen onnistui Ladataan --> diff --git a/sample/JumioMobileSample/src/main/res/values-fr/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-fr/strings-jumio-sdk.xml index f7dae0ef..d6fef924 100644 --- a/sample/JumioMobileSample/src/main/res/values-fr/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-fr/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Veuillez vérifier que vous êtes en ligne Nous avons rencontré un problème de communication avec le réseau Accès à la caméra désactivé - Numérisation indisponible pour le moment, veuillez contacter l\'équipe d\'assistance + Numérisation indisponible pour le moment, veuillez contacter l\'équipe d\'assistance Session expirée Identité numérique Permis de conduire @@ -33,6 +33,8 @@ Prendre une photo Changer de caméra Analyse des données biométriques + Pour procéder à l\'importation, assurez-vous d\'avoir téléchargé un permis de conduire numérique au format PDF à partir de l\'application officielle du gouvernement [({Carteira Digital de Trânsito})] + Importer un PDF CNH Digital Annuler Réessayer Vous serez redirigé(e) vers la sélection de documents. @@ -59,6 +61,7 @@ Assurez-vous que tous les détails de votre pièce d\'identité sont lisibles L\'image est trop floue pour être vérifiée Les images doivent être reprises + Assurez-vous d\'avoir téléchargé un permis de conduire numérique au format PDF à partir de l\'application officielle du gouvernement [({Carteira Digital de Trânsito})] Veuillez réessayer avec une image en couleur L\'image est une photocopie en noir et blanc L\'image semble être une photocopie en couleur @@ -71,12 +74,12 @@ Évitez les reflets et la lumière éblouissante Ne prenez pas de photos dans l\'obscurité L\'image a des reflets - Capturez l\'image du verso de votre pièce d\'identité + Capturez le verso de votre pièce d\'identité Il manque le verso de votre pièce d\'identité - Capturez l\'image du recto de votre pièce d\'identité + Capturez le recto de votre pièce d\'identité Il manque le recto de votre pièce d\'identité L\'image de votre pièce d\'identité ne contient pas les détails requis pour la vérification - Utilisez une pièce d\'identité valide délivrée par le gouvernement + Utilisez une pièce d\'identité valide d\'élivrée par le gouvernement Ne couvrez pas la pièce d\'identité avec votre main Assurez-vous de prendre l\'intégralité du document L\'image n\'est pas une pièce d\'identité valide @@ -85,7 +88,7 @@ Liste des documents pris en charge Le document capturé n\'est pas pris en charge Gardez les yeux ouverts - Placez la caméra à hauteur d\'yeux + Placez la caméra à hauteur de vos yeux Centrez votre visage dans le cadre et suivez les instructions à l’écran Assurez-vous que votre visage est éclairé de manière uniforme et se distingue de l\'arrière-plan Vous devez être la seule personne dans le cadre @@ -108,8 +111,8 @@ Confirmez votre photo Prenez une photo du VERSO Prenez manuellement une photo du VERSO - Prenez une photo du côté de la PHOTO - Prenez manuellement une photo du côté de la PHOTO + Prenez une PHOTO du recto + Prenez manuellement une PHOTO du recto Incliner de manière à ce que le bord inférieur soit visible, puis aligner dans le cadre Numérisation optimisée pour une meilleure performance de l\'appareil Prenez une photo de votre document @@ -138,6 +141,7 @@ Prendre un selfie Alignez votre visage dans la partie ovale et appuyez sur le bouton déclencheur Vérification du visage + Brésil CNH Digital PDF Rechercher un pays Sélectionnez le pays de délivrance Autre format @@ -148,10 +152,18 @@ Vérifiez le pays de délivrance Sélectionnez le type de document Documents pris en charge + Restez au centre du cercle + Restez immobile + Restez droit(e) + Éloignez-vous Mettez votre visage dans le cadre - J\'ai compris ! Prenons une autre photo - Trop près + Faisons un autre scan + Baissez la tête + Inclinez la tête à gauche + Inclinez la tête à droite + Levez la tête Se rapprocher + Numérisation terminée Nous devons scanner votre visage pour vérifier que vous êtes une vraie personne. Chargement en cours Sauter @@ -163,13 +175,14 @@ Placez votre passeport Vérification du résultat Commencer - Recherchez une surface bien éclairée + Trouvez une surface bien éclairée Préparez-vous à prendre un selfie Utilisez un document valide - Utilisez une pièce d\'identité valide délivrée par le gouvernement + Utilisez une pièce d\'identité valide d\'élivrée par le gouvernement L\'application peut utiliser le flash de l\'appareil photo - Démarrer la vérification - Ce processus sert à vérifier votre identité et vous protéger contre le vol d\'identité + Commencer la vérification + Ce processus de vérification est conçu pour vérifier votre identité et vous protéger contre l\'usurpation d\'identité + Veuillez réessayer Chargement réussi Envoi en cours --> diff --git a/sample/JumioMobileSample/src/main/res/values-hi-rIN/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-hi-rIN/strings-jumio-sdk.xml index 884eb7e8..cf3796a5 100644 --- a/sample/JumioMobileSample/src/main/res/values-hi-rIN/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-hi-rIN/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ कृपया जांचें कि आप ऑनलाइन हैं हमें एक नेटवर्क संचार समस्या का सामना करना पड़ा है कैमरा एक्सेस अक्षम किया गया है - इस समय स्कैनिंग उपलब्ध नहीं है, कृपया सहायता टीम से संपर्क करें + इस समय स्कैनिंग उपलब्ध नहीं है, कृपया सहायता टीम से संपर्क करें सत्र समाप्त हो गया है डिजिटल आईडी ड्राइवर लाइसेंस @@ -33,6 +33,8 @@ एक तस्वीर लें कैमरा स्विच करें बायोमेट्रिक डेटा का विश्लेषण किया जा रहा है + अपलोड जारी रखने के लिए, सुनिश्चित करें कि आपने ऑफिशियल सरकारी एप्लिकेशन [({Carteira Digital de Trânsito})] से डिजिटल ड्राइविंग लाइसेंस की PDF डाउनलोड की है + CNH Digital PDF अपलोड करें रद्द करें पुन: प्रयास करें आपको दस्तावेज़ चयन पर वापस नेविगेट किया जाएगा। @@ -59,6 +61,7 @@ सुनिश्चित करें कि आपके दस्तावेज़ पर सभी विवरण पढ़ने योग्य हैं छवि सत्यापित होने के लिए बहुत धुंधली है इमेजों को फिर से लेना आवश्यक हैं + सुनिश्चित करें कि आपने ऑफिशियल सरकारी एप्लिकेशन [({Carteira Digital de Trânsito})] से डिजिटल ड्राइविंग लाइसेंस की PDF डाउनलोड की है कृपया रंगीन छवि के साथ पुन: प्रयास करें छवि एक ब्लैक एंड व्हाइट फोटोकॉपी है छवि एक रंगीन फोटोकॉपी प्रतीत होती है @@ -138,6 +141,7 @@ एक सेल्फी लें अंडाकार फ्रेम में अपना चेहरा संरेखित करें और शटर बटन दबाएं चेहरे का सत्यापन + ब्राज़िल CNH Digital PDF देश खोजें जारी करने वाले देश का चयन करें अन्य फॉर्मेट @@ -148,10 +152,18 @@ जारी करने वाले देश को चेक करें दस्तावेज़ के प्रकार का चयन करें समर्थित दस्तावेज + बीच में रखें + हिले नहीं + सीधा रखें + पीछे हटें अपने चेहरे को फ्रेम में रखें - अब समझा! एक और शॉट लेते हैं - बहुत पास + आइए एक और स्कैन करें + नीचे झुकाएं + बाईं ओर झुकाएं + दाईं ओर झुकाएं + ऊपर झुकाएं थोड़ा और पास आएं + स्कैनिंग पूरी हुई यह वेरीफाई करने के लिए कि आप एक वास्तविक व्यक्ति हैं, हमें आपके चेहरे को स्कैन करने की आवश्यकता है। लोड हो रहा है छोड़ें @@ -170,6 +182,7 @@ ऐप कैमरा फ्लैश का इस्तेमाल कर सकता है वेरिफिकेशन शुरू करें यह प्रक्रिया आपकी पहचान वेरिफ़ाई करने और आपको पहचान की चोरी से बचाने के लिए डिज़ाइन की गई है + पुन: प्रयास करें अपलोड सफल अपलोड किया जा रहा है --> diff --git a/sample/JumioMobileSample/src/main/res/values-hr/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-hr/strings-jumio-sdk.xml index d2a6b318..8fc83304 100644 --- a/sample/JumioMobileSample/src/main/res/values-hr/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-hr/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Molimo, provjerite da ste na mreži Naišli smo na problem u mrežnoj komunikaciji Pristup kameri onemogućen - Skeniranje trenutno nije dostupno, obratite se timu za podršku + Skeniranje trenutno nije dostupno, obratite se timu za podršku Sesija je istekla Digitalni identifikacijski dokument Vozačka dozvola @@ -33,6 +33,8 @@ Snimite fotografiju Promijeni kameru Analiza biometrijskih podataka + Da biste nastavili s prijenosom, provjerite jeste li preuzeli PDF digitalne vozačke dozvole iz službene državne aplikacije [({Carteira Digital de Trânsito})] + Prenesi CNH Digital PDF Otkaži Pokušajte ponovno Bit ćete vraćeni na odabir dokumenta. @@ -59,6 +61,7 @@ Pobrinite se da su sve pojedinosti na vašem dokumentu čitljive Slika je previše mutna da bi se potvrdila Morate ponovno snimiti slike + Provjerite jeste li preuzeli PDF digitalne vozačke dozvole iz službene državne aplikacije [({Carteira Digital de Trânsito})] Pokušajte ponovno sa slikom u boji Slika je crno-bijela fotokopija Čini se da je slika fotokopija u boji @@ -138,6 +141,7 @@ Snimite selfie Poravnajte lice u ovalnom okviru i pritisnite gumb okidača Provjera lica + Brazil CNH Digital PDF Traži državu Odaberite državu izdavanja Drugi format @@ -148,10 +152,18 @@ Provjerite državu izdavanja Odaberite vrstu dokumenta Podržani dokumenti + Centriraj lice + Budite mirni + Drži glavu ravno + Odmakni se Stavite svoje lice u okvir - Razumijem! Pokušajmo još jedanput - Preblizu + Ponovno skeniranje + Nagni prema dolje + Nagni ulijevo + Nagni udesno + Podigni glavu Približite se + Skeniranje je završeno Moramo skenirati vaše lice da bismo potvrdili da ste stvarna osoba. Učitavam Preskoči @@ -168,8 +180,9 @@ Upotrijebite valjan dokument Koristite zakonski izdan identifikacijski dokument Aplikacija može koristiti bljeskalicu kamere - Započni provjeru + Počnite verifikaciju Ovaj je postupak osmišljen radi provjere vašeg identiteta i zaštite od krađe identiteta + Pokušajte ponovno Prijenos je uspio Prijenos --> diff --git a/sample/JumioMobileSample/src/main/res/values-hu/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-hu/strings-jumio-sdk.xml index 74aeee35..b2ba5ac3 100644 --- a/sample/JumioMobileSample/src/main/res/values-hu/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-hu/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Ellenőrizze, hogy kapcsolódik-e az internethez. Hálózati kommunikációs problémába ütköztünk A kamera hozzáférése letiltva - A beolvasás jelenleg nem érhető el, vegye fel a kapcsolatot a témogatási csapattal + A beolvasás jelenleg nem érhető el, vegye fel a kapcsolatot a témogatási csapattal A munkamenet lejárt Digitális azonosító Vezetői engedély @@ -33,6 +33,8 @@ Fénykép készítése Kamera váltása Biometrikus adatok elemzése + A feltöltés folytatásához feltétlenül töltsön le egy PDF-formátumú digitális járművezetői engedélyt a hivatalos kormányzati alkalmazásból [({Carteira Digital de Trânsito})] + CNH Digital PDF feltöltése Mégse Újra próbálkozás Vissza fog térni a dokumentum kiválasztásához. @@ -59,6 +61,7 @@ Győződjön meg arról, hogy a dokumentum minden adata olvasható. A kép túl homályos az ellenőrzéshez A képek készítését meg kell ismételni + Feltétlenül töltsön le egy PDF-formátumú digitális járművezetői engedélyt a hivatalos kormányzati alkalmazásból [({Carteira Digital de Trânsito})] Kérjük, próbálkozzon újra egy színes képpel A kép fekete-fehér fénymásolat A kép színes fénymásolatnak tűnik @@ -138,6 +141,7 @@ Készítsen egy szelfit Arcát helyezze az ovális keretbe, majd nyomja meg az exponáló gombot. Arcellenőrzés + Brazil CNH Digital PDF Ország keresése Válasszon kiállító országot Egyéb formátum @@ -148,10 +152,18 @@ Ellenőrizze a kiállító országot Válassza ki az igazolvány típusát Támogatott dokumentumok + Helyezkedjen középre + Maradjon mozdulatlan + Tartsa egyenesen + Menjen távolabb Igazítsa az arcát a keretbe - Értem! Készítsünk egy másik fényképet - Túl közel + Végezzünk még egy beolvasást + Döntse előre + Döntse balra + Döntse jobbra + Döntse hátra Mozgassa közelebb + A szkennelés befejeződött Be kell szkennelnünk az arcát, hogy meggyőződjünk róla, valódi személyről van szó. Betöltés Kihagyás @@ -168,8 +180,9 @@ Érvényes okmányt használjon Használjon kormány által kiadott érvényes igazolványt Az alkalmazás a kamera vakuját használhatja - Ellenőrzés indítása + Kezdje meg az ellenőrzést Ez a folyamat segít ellenőrizni a személyazonosságát, és védelmet nyújt a személyazonosság-lopással szemben + Próbálja meg újra Feltöltés sikeres Feltöltés --> diff --git a/sample/JumioMobileSample/src/main/res/values-in/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-in/strings-jumio-sdk.xml index bf54f48a..686309be 100644 --- a/sample/JumioMobileSample/src/main/res/values-in/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-in/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Periksa apakah Anda sedang online Kami mengalami masalah komunikasi jaringan Akses kamera dinonaktifkan - Pemindaian tidak tersedia saat ini, hubungi tim dukungan + Pemindaian tidak tersedia saat ini, hubungi tim dukungan Sesi Berakhir ID digital SIM @@ -33,6 +33,8 @@ Ambil foto Alihkan kamera Menganalisis data biometrik + Untuk melanjutkan pengunggahan, pastikan Anda telah mengunduh PDF lisensi driver digital dari aplikasi resmi pemerintah [({Carteira Digital de Trânsito})] + Unggah PDF CNH Digital Batal Coba lagi Anda akan diarahkan kembali ke pemilihan dokumen. @@ -59,6 +61,7 @@ Pastikan semua detail pada dokumen Anda terbaca Gambar terlalu buram untuk diverifikasi Gambar harus diambil ulang + Pastikan Anda telah mengunduh PDF lisensi driver Digital dari aplikasi resmi pemerintah [({Carteira Digital de Trânsito})] Harap coba lagi dengan gambar berwarna Gambar fotokopi hitam putih Gambar tampak seperti fotokopi berwarna @@ -138,6 +141,7 @@ Ambil selfie Luruskan wajah Anda dalam bingkai oval lalu tekan tombol shutter Verifikasi Wajah + CNH Digital Brasil PDF Cari Negara Pilih negara penerbit Format lainnya @@ -148,10 +152,18 @@ Periksa negara penerbit Pilih jenis dokumen Dokumen yang didukung + Tetap di tengah + Tahan + Tetap tegak + Menjauh Letakkan wajah Anda di bingkai - Oke! Ayo ambil gambar lain. - Terlalu dekat + Ambil pindaian lain + Geser ke bawah + Miring kiri + Miring kanan + Geser ke atas Merapat + Pemindaian selesai Kami perlu memindai wajah Anda untuk memverifikasi bahwa Anda benar-benar orang. Memuat Melewatkan @@ -170,6 +182,7 @@ Aplikasi mungkin menggunakan blitz kamera Mulai verifikasi Proses ini dirancang untuk memverifikasi identitas dan melindungi Anda dari pencurian identitas + Harap coba lagi Pengunggahan berhasil Mengunggah --> diff --git a/sample/JumioMobileSample/src/main/res/values-it/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-it/strings-jumio-sdk.xml index 43ef4844..b4110d4b 100644 --- a/sample/JumioMobileSample/src/main/res/values-it/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-it/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Controlla di essere online Abbiamo riscontrato un problema di comunicazione di rete Accesso alla fotocamera disabilitato - La scansione non è disponibile al momento. Rivolgiti al team assistenza + La scansione non è disponibile al momento. Rivolgiti al team assistenza Sessione scaduta Identità digitale Patente di guida @@ -33,6 +33,8 @@ Scattare una foto Cambia fotocamera Analisi dei dati biometrici + Per procedere con il caricamento, assicurati di aver scaricato la patente di guida digitale in formato PDF dall\'applicazione ufficiale del governo [({Carteira Digital de Trânsito})] + Carica CNH Digital in PDF Annulla Riprova Tornerai alla selezione del documento. @@ -59,6 +61,7 @@ Assicurati che tutti i dettagli del tuo documento siano leggibili L\'immagine è troppo sfocata per la verifica Le foto devono essere scattate di nuovo + Assicurati di aver scaricato la patente di guida digitale in formato PDF dall\'applicazione ufficiale del governo [({Carteira Digital de Trânsito})] Riprova con un\'immagine a colori L\'immagine è una fotocopia in bianco e nero L\'immagine sembra essere una fotocopia a colori @@ -138,6 +141,7 @@ Scatta un selfie Allinea il viso con la cornice ovale e premi il pulsante di scatto Riconoscimento facciale + Brasile CNH Digital PDF Cercare Paese Seleziona il paese di emissione Altro formato @@ -148,10 +152,18 @@ Scegli il paese di emissione Seleziona il tipo di documento Documenti supportati + Centra il viso + Non muoverti + Raddrizza la testa + Allontanati Inquadra il viso nell\'ovale - Bene! Facciamo un\'altra scansione - Troppo vicino + Facciamo un\'altra scansione + Inclina in basso + Inclina a sinistra + Inclina a destra + Inclina in alto Avvicinati + Scansione completata Dobbiamo eseguire una scansione del tuo viso per verificare che tu sia una persona reale. Caricamento Salta @@ -170,6 +182,7 @@ L\'applicazione potrebbe utilizzare il flash della fotocamera Inizia la verifica Questo processo è pensato per verificare la tua identità e proteggerti dai furti d\'identità + Riprova Caricamento completato Caricamento --> diff --git a/sample/JumioMobileSample/src/main/res/values-ja-rJP/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-ja-rJP/strings-jumio-sdk.xml index 2aa0f63a..77d6dee4 100644 --- a/sample/JumioMobileSample/src/main/res/values-ja-rJP/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-ja-rJP/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ オンラインであることを確認してください ネットワーク通信の問題が発生しました カメラへのアクセスが無効になっています - スキャンは現在利用できません。サポートチームにお問い合わせください + スキャンは現在利用できません。サポートチームにお問い合わせください セッションの有効期限が切れました デジタルID 運転免許証 @@ -33,6 +33,8 @@ 写真を撮る カメラを切り替える 生体認証データを分析しています + アップロードを続けるには、政府の公式アプリ[({Carteira Digital de Trânsito})]からデジタル運転免許証のPDFをダウンロードしていることを確認してください。 + CNH Digital PDFをアップロード キャンセル もう一度やり直してください ドキュメント選択画面に戻ります。 @@ -59,6 +61,7 @@ ドキュメントのすべての詳細情報が読み取り可能であることを確認してください 画像がぼやけすぎているため認証できません 画像は撮り直す必要があります + 政府の公式アプリ[({Carteira Digital de Trânsito})]からデジタル運転免許証のPDFをダウンロードしていることを確認してください。 カラー画像でもう一度やり直してください 画像は白黒コピーです 画像はカラーコピーと思われます @@ -138,6 +141,7 @@ 自撮り 楕円の枠に顔を合わせてシャッターボタンを押してください 顔認証 + ブラジル CNH Digital PDF 国を検索 発行国を選択 その他の形式 @@ -148,10 +152,18 @@ 発行国を確認 ドキュメントのタイプを選択 サポートされるドキュメント + 中心を保ってください + 静止したまま + まっすぐ保ってください + 退出 顔をフレームの中に入れます - 了解!もう一枚撮りましょう - 近すぎます + もう一枚撮りましょう + 下に傾けてください + 左に傾けてください + 右に傾けてください + 上に傾けてください 近くに移動します。 + スキャンが完了しました あなたが実在の人物であることを確認するため、顔をスキャンする必要があります。 読み込み中 スキップ @@ -170,6 +182,7 @@ アプリがカメラのフラッシュをオンにする場合があります 認証を開始 このプロセスは、本人確認を行い、個人情報の盗難から保護することを目的としています + もう一度やり直してください 正常にアップロードされました アップロード中 --> diff --git a/sample/JumioMobileSample/src/main/res/values-km-rKH/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-km-rKH/strings-jumio-sdk.xml index 5852cc99..defc1e60 100644 --- a/sample/JumioMobileSample/src/main/res/values-km-rKH/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-km-rKH/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ សូមពិនិត្យមើលថាអ្នកកំពុងអនឡាញ យើងបានជួបបញ្ហាទំនាក់ទំនងបណ្តាញ ការចូលប្រើកាមេរ៉ាត្រូវបានបិទ - ការស្កេនមិនមាននៅពេលនេះទេ សូមទាក់ទងក្រុមផ្ដល់ជំនួយ + ការស្កេនមិនមាននៅពេលនេះទេ សូមទាក់ទងក្រុមផ្ដល់ជំនួយ រយៈពេលបានផុតកំណត់ អត្តសញ្ញាណបណ្ណឌីជីថល បណ្ណបើកបរ @@ -33,6 +33,8 @@ ថតរូប ប្តូរកាមេរ៉ា កំពុងវិភាគទិន្នន័យជីវមាត្រ + ដើម្បីបន្តអាប់ឡូដ ត្រូវប្រាកដថា អ្នកបានទាញយកប័ណ្ណបើកបរឌីជីថលជាទម្រង់ PDF ពីកម្មវិធីផ្លូវការរបស់រដ្ឋាភិបាល [({Carteira Digital de Trânsito})] + អាប់ឡូដ CNH Digital PDF បោះបង់ សូមព្យាយាមម្ដងទៀត អ្នកនឹងរុករកត្រលប់មកកាន់ការជ្រើសរើសឯកសារវិញ។ @@ -59,6 +61,7 @@ ត្រូវប្រាកដថាព័ត៌មានលម្អិតទាំងអស់នៅលើឯកសាររបស់អ្នកអាចអានដាច់ រូបភាពព្រិលពេកមិនអាចផ្ទៀងផ្ទាត់បានទេ រូបភាពត្រូវតែថតម្ដងទៀត + ត្រូវប្រាកដថា អ្នកបានទាញយកប័ណ្ណបើកបរឌីជីថលជាទម្រង់ PDF ពីកម្មវិធីផ្លូវការរបស់រដ្ឋាភិបាល [({Carteira Digital de Trânsito})] សូមព្យាយាមម្តងទៀតជាមួយនឹងរូបភាពពណ៌ រូបភាពគឺជារូបថតចម្លងសខ្មៅ រូបភាពហាក់ដូចជារូបថតចម្លងពណ៌ @@ -138,6 +141,7 @@ ថតរូបសែលហ្វី តម្រង់មុខរបស់អ្នកក្នុងស៊ុមរាងពងក្រពើ ហើយចុចប៊ូតុងបិទបើកកាមេរ៉ា ការផ្ទៀងផ្ទាត់ទម្រង់មុខ + CNH Digital PDF ពីប្រាហ៊ីល ស្វែងរកប្រទេស ជ្រើសរើសប្រទេសដែលចេញប័ណ្ណ ទម្រង់ផ្សេងទៀត @@ -148,10 +152,18 @@ ពិនិត្យប្រទេសដែលចេញប័ណ្ណ ជ្រើសរើសប្រភេទឯកសារ ឯកសារដែលគាំទ្រ + រក្សានៅកណ្ដាល + កាន់ឲ្យនឹង + រក្សាឲ្យត្រង់ + ខិតទៅឲ្យឆ្ងាយ ដាក់មុខរបស់អ្នកនៅក្នុងស៊ុម - យល់ហើយ! អញ្ចឹងថតមួយទៀត - ជិតពេក + តោះថតការស្កេនមួយទៀត + ផ្អៀងចុះក្រោម + ផ្អៀងទៅឆ្វេង + ផ្អៀងទៅស្ដាំ + ផ្ទៀងឡើងលើ ខិតមកជិតជាងមុន + បានបញ្ចប់ការស្កេន យើងត្រូវថតការស្កេនមុខរបស់អ្នក ដើម្បីផ្ទៀងផ្ទាត់ថា អ្នកជាមនុស្សពិត។ កំពុងផ្ទុក រំលង @@ -168,8 +180,9 @@ ប្រើឯកសារត្រឹមត្រូវ ប្រើអត្តសញ្ញាណប័ណ្ណមានសុពលភាពដែលចេញដោយរដ្ឋ កម្មវិធីនេះអាចនឹងប្រើផ្លាសរបស់កាមេរ៉ា - ចាប់ផ្តើមការផ្ទៀងផ្ទាត់ + ចាប់ផ្ដើមផ្ទៀងផ្ទាត់ ដំណើរការនេះត្រូវបានរៀបចំឡើង ដើម្បីផ្ទៀងផ្ទាត់អត្តសញ្ញាណរបស់អ្នក និងការពារអ្នកពីចោរលួចអត្តសញ្ញាណ + សូមព្យាយាមម្តងទៀត ការផ្ទុកឡើងបានជោគជ័យ កំពុងផ្ទុកឡើង --> diff --git a/sample/JumioMobileSample/src/main/res/values-ko-rKR/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-ko-rKR/strings-jumio-sdk.xml index 610e34b3..da560f5c 100644 --- a/sample/JumioMobileSample/src/main/res/values-ko-rKR/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-ko-rKR/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ 온라인 상태인지 확인해 주세요 네트워크 통신 문제가 발생했습니다 카메라 액세스 비활성화 - 현재 스캔을 사용할 수 없습니다. 지원팀에 문의하시기 바랍니다. + 현재 스캔을 사용할 수 없습니다. 지원팀에 문의하시기 바랍니다. 세션 만료 디지털 ID 운전 면허증 @@ -33,6 +33,8 @@ 사진 촬영 카메라 전환 생체 데이터 분석 + 업로드하려면 정부 공식 신청서 [({Carteira Digital de Trânsito})]에서 디지털 운전면허증 PDF를 다운로드했는지 확인하세요 + CNH Digital PDF 업로드 취소 다시 시도 문서 선택으로 돌아갑니다. @@ -59,6 +61,7 @@ 문서의 모든 세부 정보를 읽을 수 있는지 확인하세요 이미지가 너무 흐려서 확인할 수 없습니다 이미지를 다시 찍어야 합니다 + 정부 공식 신청서 [({Carteira Digital de Trânsito})]에서 디지털 운전면허증 PDF를 다운로드했는지 확인하세요 컬러 이미지로 다시 시도하세요 이미지가 흑백 사본입니다 이미지가 컬러 사본인 것 같습니다 @@ -138,6 +141,7 @@ 셀카 찍기 타원형 프레임 안에 얼굴을 놓고 촬영 버튼을 누르세요 얼굴 인증 + 브라질 CNH Digital PDF 국가 검색 발급 국가 선택 기타 형식 @@ -148,10 +152,18 @@ 발급 국가 확인 서류 유형 선택 지원되는 문서 + 중앙에 유지하세요 + 가만히 계세요 + 똑바로 들어주세요 + 뒤로 물러나세요 프레임에 얼굴을 놓아주세요 - 좋아요! 한 번 더 촬영해 봅시다 - 너무 가까움 + 한 번 더 스캔하겠습니다 + 아래로 기울이세요 + 왼쪽으로 기울이세요 + 오른쪽으로 기울이세요 + 위로 기울이세요 가까이 와주세요 + 스캔 완료 실제 사람인지 확인하기 위해 얼굴을 스캔해야 합니다. 불러오는 중 건너 뛰기 @@ -168,8 +180,9 @@ 유효한 문서를 사용하세요 유효한 정부 발급 신분증을 사용하세요 앱에서 카메라 플래시를 사용할 수 있습니다 - 확인 시작 + 인증 시작 이 절차는 신원을 확인하고 신원 도용으로부터 귀하를 보호하기 위해 고안되었습니다 + 다시 시도하세요 업로드 성공 업로드 중 --> diff --git a/sample/JumioMobileSample/src/main/res/values-lt/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-lt/strings-jumio-sdk.xml index 75242b29..e15ea09e 100644 --- a/sample/JumioMobileSample/src/main/res/values-lt/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-lt/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Patikrinkite, ar esate prisijungę prie interneto Aptikta ryšio problema Prieiga prie fotoaparato išjungta - Šiuo metu skenavimas neprieinamas, susisiekite su pagalbos komanda + Šiuo metu skenavimas neprieinamas, susisiekite su pagalbos komanda Seanso laikas baigėsi Skaitmeninė tapatybė Vairuotojo pažymėjimas @@ -33,6 +33,8 @@ Nufotografuokite Perjungti kamerą Analizuojami biometriniai duomenys + Norėdami tęsti įkėlimą įsitikinkite, kad atsisiuntėte skaitmeninio vairuotojo pažymėjimo PDF failą iš oficialios vyriausybės programėlės [({Carteira Digital de Trânsito})] + Įkelti „CNH Digital PDF“ Atšaukti Bandykite dar kartą Būsite nukreipti atgal į dokumentų pasirinkimą. @@ -59,6 +61,7 @@ Patikrinkite, ar visi jūsų dokumento duomenys įskaitomi Nuotrauka neryški, todėl neįmanoma patvirtinti Nuotraukas būtina pakartoti + Įsitikinkite, kad atsisiuntėte skaitmeninio vairuotojo pažymėjimo PDF failą iš oficialios vyriausybės programėlės [({Carteira Digital de Trânsito})] Pateikite spalvotą nuotrauką Nuotrauka yra nespalvota fotokopija Panašu, kad tai spalvota fotokopija @@ -138,6 +141,7 @@ Pasidarykite asmenukę Sutalpinkite savo veidą į ovalų rėmelį ir fotografuokite Veido atpažinimas + Brazilijos CNH Digital PDF Ieškoti šalies Pasirinkite išdavimo šalį Kitas formatas @@ -148,10 +152,18 @@ Patikrinkite išdavimo šalį Pasirinkite dokumento tipą Palaikomi dokumentai + Laikykitės centro + Nejudėkite + Laikykitės tiesiai + Atsitraukite Patalpinkite savo veidą rėmelyje - Supratau! Pabandom iš naujo - Per arti + Skenuokime dar kartą + Palenkite žemyn + Pasisukite į kairę + Pasisukite į dešinę + Palenkite aukštyn Prieikite arčiau + Skenavimas baigtas Norėdami įsitikinti, kad esate tikras asmuo, turėsime nuskaityti jūsų veidą. Įkeliama Praleisti @@ -170,6 +182,7 @@ Programėlė gali pasinaudoti fotoaparato blykste Pradėkite patvirtinimą Šio proceso tikslas – patvirtinti jūsų tapatybę ir užtikrinti apsaugą nuo tapatybės vagystės + Bandykite dar kartą Įkėlimas sėkmingas Įkeliama --> diff --git a/sample/JumioMobileSample/src/main/res/values-lv/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-lv/strings-jumio-sdk.xml index 23c62478..88b51333 100644 --- a/sample/JumioMobileSample/src/main/res/values-lv/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-lv/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Lūdzu, pārbaudiet, vai esat tiešsaistē Esam saskārušies ar tīkla komunikācijas problēmu Piekļuve kamerai ir atspējota - Skenēšana pašlaik nav pieejama. Lūdzu, sazinieties ar atbalsta komandu + Skenēšana pašlaik nav pieejama. Lūdzu, sazinieties ar atbalsta komandu Sesija beigusies Digitālais ID Vadītāja apliecība @@ -33,6 +33,8 @@ Uzņemt fotoattēlu Pārslēgt kameru Analizē biometriskos datus + Lai turpinātu augšupielādi, pārbaudiet, vai esat lejupielādējis digitālās autovadītāja apliecības PDF no valdības oficiālās lietotnes [({Carteira Digital de Trânsito})] + Augšupielādēt CNH Digital PDF Atcelt Mēģiniet vēlreiz Jūs atgriezīsieties dokumentu atlases sadaļā. @@ -59,6 +61,7 @@ Pārliecinieties, vai visi jūsu dokumentā esošie dati ir skaidri salasāmi Attēls ir pārāk izplūdis, lai to varētu pārbaudīt Fotoattēli jāuzņem vēlreiz + Pārbaudiet, vai esat lejupielādējis digitālās autovadītāja apliecības PDF no valdības oficiālās lietotnes [({Carteira Digital de Trânsito})] Mēģiniet vēlreiz ar krāsainu attēlu Attēls ir melnbalta fotokopija Šķiet, ka attēls ir krāsaina fotokopija @@ -138,6 +141,7 @@ Uzņemt pašportretu Iecentrējiet seju ovālajā rāmī un nospiediet slēdža pogu Sejas pārbaude + Brazīlijas CNH Digital PDF Meklēt valsti Izvēlieties izdevējvalsti Cits formāts @@ -148,10 +152,18 @@ Pārbaudiet izdevējvalsti Izvēlieties dokumenta veidu Atbalstītie dokumenti + Centrējiet + Nekustieties + Paceliet + Atkāpieties Ievietojiet seju rāmītī - Sapratu! Pamēģināsim vēlreiz - Pārāk tuvu + Noskanēsim vēlreiz + Nolieciet zemāk + Nolieciet pa kreisi + Nolieciet pa labi + Paceliet augstāk Panāciet tuvāk + Skenēšana pabeigta Mums ir jānoskenē Jūsu seja, lai pārbaudītu, vai esat īsta persona. Ielādē Izlaist @@ -170,6 +182,7 @@ Lietotne var izmantot kameras zibspuldzi Sākt verifikāciju Process paredzēts jūsu identitātes verificēšanai un aizsardzībai pret identitātes zādzību + Mēģiniet vēlreiz Augšupielāde veiksmīga Augšupielādē --> diff --git a/sample/JumioMobileSample/src/main/res/values-mt-rMT/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-mt-rMT/strings-jumio-sdk.xml index 5fa225d8..99d958b1 100644 --- a/sample/JumioMobileSample/src/main/res/values-mt-rMT/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-mt-rMT/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Jekk jogħġbok iċċekkja li qiegħed online Iltqajna ma\' problema fil-komunikazzjoni tan-netwerk L-aċċess għall-kamera huwa ddiżattivat - Bħalissa ma tistax tiskennja, jekk jogħġbok ikkuntattja lit-tim tal-appoġġ + Bħalissa ma tistax tiskennja, jekk jogħġbok ikkuntattja lit-tim tal-appoġġ Is-sessjoni Skadiet ID diġitali Liċenzja tas-Sewqan @@ -33,6 +33,8 @@ Ħu ritratt Eqleb għall-kamera l-oħra Qed janalizza d-dejta bijometrika + Biex ittella\' l-PDF, aċċerta li niżżilt PDF tal-liċenzja tas-sewqan diġitali mill-applikazzjoni uffiċjali tal-gvern [({Carteira Digital de Trânsito})] + Tella\' PDF ta\' CNH Digital Ikkanċella Erġa\' pprova Se tittieħed lura fis-selezzjoni tad-dokumenti. @@ -59,6 +61,7 @@ Kun żgur li d-dettalji kollha fuq id-dokument tiegħek jistgħu jinqraw Ir-ritratt mhux ċar biżżejjed biex jiġi vverifikat Ir-ritratti għandhom bżonn jittieħdu mill-ġdid + Aċċerta li niżżilt PDF tal-liċenzja tas-sewqan Diġitali mill-applikazzjoni uffiċjali tal-gvern [({Carteira Digital de Trânsito})] Jekk jogħġbok erġa\' pprova b\'immaġni tal-kulur L-immaġni hija fotokopja bl-abjad u bl-iswed L-immaġni tidher li hija fotokopja bil-kulur @@ -138,6 +141,7 @@ Ħu stessu Poġġi wiċċek fil-frejm ovali u agħfas il-buttuna biex tieħu r-ritratt Verifika tal-Wiċċ + Brażil CNH Digital PDF Fittex il-Pajjiż Agħżel il-pajjiż tal-ħruġ Format Ieħor @@ -148,10 +152,18 @@ Iċċekkja l-pajjiż tal-ħruġ Agħżel it-tip ta\' dokument Dokumenti appoġġjati + Żomm fin-nofs + Tiċċaqlaqx + Oqgħod dritt + Ersaq lura Poġġi wiċċek fil-frejm - Ħadnih! Ejja nieħdu ieħor - Qiegħed wisq qrib + Ejja nieħdu scan ieħor + Mejjel \'l isfel + Mejjel lejn ix-xellug + Mejjel lejn il-lemin + Mejjel \'il fuq Ersaq aktar viċin + L-iskennjar lest Irridu nieħdu niskennjaw wiċċek biex nivverifikaw li int persuna reali. Qed jillowdja Aqbeż @@ -170,6 +182,7 @@ L-app tista\' tuża l-flash tal-kamera Ibda l-verifika Dan il-proċess hu ddisinjat biex jivverifika l-identità tiegħek u jipproteġik mis-serq tal-identità + Erġa\' pprova Telgħu b\'suċċess Qed itella\' --> diff --git a/sample/JumioMobileSample/src/main/res/values-nb/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-nb/strings-jumio-sdk.xml index d0bc596c..ae0f5667 100644 --- a/sample/JumioMobileSample/src/main/res/values-nb/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-nb/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Kontroller om du er online Det har oppstått et problem med nettverkskommunikasjon Kameratilgang deaktivert - Skanning er ikke tilgjengelig for øyeblikket. Kontakt kundestøtte + Skanning er ikke tilgjengelig for øyeblikket. Kontakt kundestøtte Økten er utløpt Digital-ID Førerkort @@ -33,6 +33,8 @@ Ta et bilde Bytt kameravinkel Analysere biometriske data + For å gå videre må du kontrollere at du har lastet ned et digitalt førerkort som PDF fra den offisielle appen fra brasilianske myndigheter [({Carteira Digital de Trânsito})] + Last opp PDF av CNH Digital Avbryt Prøv igjen Du vil sendes tilbake til dokumentvalget. @@ -59,6 +61,7 @@ Sørg for at alle opplysninger på dokumentet er lesbare Bildet er for uskarpt til å bli bekreftet Bildene må tas på nytt + Sørg for at du har lastet ned et digitalt førerkort som PDF fra den offisielle appen fra brasilianske myndigheter [({Carteira Digital de Trânsito})] Prøv igjen med et fargebilde Bildet er en sort/hvit fotokopi Bildet ser ut til å være en fargefotokopi @@ -138,6 +141,7 @@ Ta en selfie Juster ansiktet ditt i den ovale rammen og trykk på utløserknappen Ansiktsbekreftelse + Brasil CNH Digital PDF Søk i land Velg utstedelsesland Annet format @@ -148,10 +152,18 @@ Sjekk utstedelsesland Velg dokumenttype Støttede dokumenter + Hold deg i midten + Stå helt i ro + Hold deg rett + Trekk deg unna Plasser ansiktet ditt i rammen - Flott! La oss ta enda et bilde. - For nært + La oss skanne på ny + Vipp nedover + Vipp mot venstre + Vipp mot høyre + Vipp oppover Kom nærmere + Skanningen er fullført Vi må skanne ansiktet ditt for å bekrefte at du er en ekte person. Laster Hoppe over @@ -168,8 +180,9 @@ Bruk et gyldig dokument Bruk en gyldig offentlig utstedt ID Appen kan bruke kamerablitsen - Start bekreftelse + Start verifisering Prosessen er utformet for å bekrefte identiteten din og beskytte deg mot identitetstyveri + Vennligst prøv igjen Opplasting vellykket Laster opp --> diff --git a/sample/JumioMobileSample/src/main/res/values-night/colors.xml b/sample/JumioMobileSample/src/main/res/values-night/colors.xml index c46f3724..b2a93c43 100644 --- a/sample/JumioMobileSample/src/main/res/values-night/colors.xml +++ b/sample/JumioMobileSample/src/main/res/values-night/colors.xml @@ -6,4 +6,5 @@ #FFFFFF #1C2229 + #FFFFFF diff --git a/sample/JumioMobileSample/src/main/res/values-night/styles.xml b/sample/JumioMobileSample/src/main/res/values-night/styles.xml index 70ca9a82..7451f729 100644 --- a/sample/JumioMobileSample/src/main/res/values-night/styles.xml +++ b/sample/JumioMobileSample/src/main/res/values-night/styles.xml @@ -9,6 +9,7 @@ #EC407A #EC407A #F2F233 + #00B0FF #333D47 #57ffc7 diff --git a/sample/JumioMobileSample/src/main/res/values-nl/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-nl/strings-jumio-sdk.xml index 58f0f1ae..572316ac 100644 --- a/sample/JumioMobileSample/src/main/res/values-nl/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-nl/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Controleer of u online bent We zijn gestuit op een netwerk communicatieprobleem Cameratoegang ontgrendeld - Scannen is momenteel niet beschikbaar, neem contact op met het ondersteuningsteam + Scannen is momenteel niet beschikbaar, neem contact op met het ondersteuningsteam Sessie verlopen Digitale ID Rijbewijs @@ -33,6 +33,8 @@ Neem een foto Schakel camera Biometrische gegevens analyseren + Om verder te gaan met uploaden, moet je ervoor zorgen dat je een pdf van het digitale rijbewijs hebt gedownload van de officiële overheidsapplicatie [({Carteira Digital de Trânsito})]. + CNH Digital-pdf uploaden Annuleer Probeer het opnieuw Je wordt teruggeleid naar de documentselectie. @@ -59,6 +61,7 @@ Zorg ervoor dat alle details op uw document leesbaar zijn. De afbeelding is te wazig om te worden geverifieerd Foto\'s moeten opnieuw worden genomen + Zorg ervoor dat je een pdf van het digitale rijbewijs hebt gedownload van de officiële overheidsapplicatie [({Carteira Digital de Trânsito})]. Probeer het opnieuw met een foto in kleur. De afbeelding is een zwart-wit foto De afbeelding lijkt een kleurenkopie te zijn @@ -138,6 +141,7 @@ Neem een selfie Plaats uw gezicht in het ovale kader en druk op de ontspanknop Gezichtsverificatie + Brazilië CNH Digital PDF Zoek land Selecteer het land van afgifte Ander formaat @@ -148,10 +152,18 @@ Controleer het land van afgifte Selecteer type identiteitsbewijs Ondersteunde documenten + In midden houden + Niet bewegen + Rechtop houden + Afstand nemen Plaats je gezicht in het frame - Gelukt! Laten we nog een foto nemen - Te dichtbij + Laten we nog een scan maken + Omlaag kantelen + Links kantelen + Rechts kantelen + Omhoog kantelen Kom dichterbij + Scannen voltooid We moeten een scan van je gezicht maken om te controleren of je een echt persoon bent. Aan het laden Overspringen @@ -170,6 +182,7 @@ De app kan de cameraflits gebruiken Verificatie starten Dit proces is ontworpen om je identiteit te bevestigen en je te beschermen tegen identiteitsdiefstal + Probeer het nog eens Uploaden succesvol Uploaden --> diff --git a/sample/JumioMobileSample/src/main/res/values-pl/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-pl/strings-jumio-sdk.xml index 5066fd9c..5055d83b 100644 --- a/sample/JumioMobileSample/src/main/res/values-pl/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-pl/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Sprawdź, czy jesteś online Napotkaliśmy problem z komunikacją sieciową Dostęp do aparatu wyłączony - Skanowanie jest obecnie niedostępne, skontaktuj się z zespołem pomocy technicznej + Skanowanie jest obecnie niedostępne, skontaktuj się z zespołem pomocy technicznej Sesja wygasła Identyfikator cyfrowy Prawo jazdy @@ -33,6 +33,8 @@ Zrób zdjęcie Przełącz aparat Analiza danych biometrycznych + Przed przesłaniem dokumentu upewnij się, że plik PDF cyfrowego prawa jazdy został pobrany z oficjalnej aplikacji rządowej [({Carteira Digital de Trânsito})] + Załaduj profil cyfrowy CNH w pliku PDF Anuluj Spróbuj ponownie Nastąpi powrót do wyboru dokumentów. @@ -59,6 +61,7 @@ Upewnij się, że wszystkie szczegóły na dokumencie są czytelne Obraz jest zbyt rozmazany, aby można go było zweryfikować Zdjęcia muszą zostać zrobione ponownie + Upewnij się, że cyfrowe prawo jazdy w pliku PDF zostało pobrane z oficjalnej aplikacji rządowej [({Carteira Digital de Trânsito})] Spróbuj ponownie z kolorowym obrazem Obraz jest czarno-białą fotokopią Obraz wydaje się być kolorową fotokopią @@ -138,20 +141,29 @@ Zrób zdjęcie swojej twarzy Umieść twarz w owalnej ramce i zrób zdjęcie ręcznie Weryfikacja twarzy + Brazylijskie CNH Digital w PDF Wyszukaj kraj Wybierz kraj wydania Inny format Plastikowa karta Jaki to format? - Przód i tył dokumentu + Przód i tył Strona ze zdjęciem Wybierz kraj wydania Wybierz typ dokumentu tożsamości Obsługiwane dokumenty + Zachowaj wyśrodkowanie + Nie ruszaj się. + Utrzymuj pozycję pionową + Odsuń się Umieść twarz w ramce - Mamy to! Zróbmy jeszcze jedno ujęcie - Zbyt blisko + Zrób kolejny skan + Pochyl się w dół + Pochyl się w lewo + Pochyl się w prawo + Odchyl się w górę Przybliż twarz + Skanowanie zakończone Musimy wykonać skan Twojej twarzy, aby sprawdzić, czy jesteś prawdziwą osobą. Ładowanie Pomiń @@ -170,6 +182,7 @@ Aplikacja może korzystać z lampy błyskowej aparatu Rozpocznij weryfikację Celem tej procedury jest sprawdzenie Twojej tożsamości i ochrona przed jej kradzieżą + Spróbuj ponownie Przesyłanie zakończone pomyślnie Przesyłanie --> diff --git a/sample/JumioMobileSample/src/main/res/values-pt-rBR/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-pt-rBR/strings-jumio-sdk.xml index e9d64051..56a8f853 100644 --- a/sample/JumioMobileSample/src/main/res/values-pt-rBR/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-pt-rBR/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Verifique se você está on-line Encontramos um problema de comunicação de rede Acesso à câmera desativado - Escaneamento não disponível no momento, entre em contato com a equipe de suporte + Escaneamento não disponível no momento, entre em contato com a equipe de suporte Sessão expirada Identidade digital Cart. de motorista @@ -33,6 +33,8 @@ Tirar uma foto Alternar câmera Analisando dados biométricos + Para prosseguir com o envio, baixe a versão PDF da carteira de motorista digital do aplicativo oficial do governo [({Carteira Digital de Trânsito})] + Enviar arquivo PDF da CNH Digital Cancelar Tente novamente Você retornará à seleção de documentos. @@ -59,6 +61,7 @@ Certifique-se de que todos os detalhes do seu documento estejam legíveis A imagem está muito desfocada para ser verificada As imagens devem ser refeitas + Baixe a versão PDF da carteira de motorista digital do aplicativo oficial do governo [({Carteira Digital de Trânsito})] Tente novamente com uma imagem colorida A imagem é uma fotocópia em preto e branco A imagem parece ser uma fotocópia colorida @@ -138,6 +141,7 @@ Tire uma selfie Alinhe seu rosto na moldura oval e pressione o botão do obturador Verificação facial + PDF do CNH Digital do Brasil Pesquisar país Selecione o país emissor Outro formato @@ -148,10 +152,18 @@ Verifique o país emissor Selecione o tipo de documento Documentos suportados + Mantenha-se no centro + Não se mexa + Mantenha-se em posição ereta + Afaste-se Coloque seu rosto na moldura - Entendi! Vamos tentar de novo - Muito próximo + Vamos fazer outra análise + Incline para baixo + Incline para a esquerda + Incline para a direita + Incline para cima Aproxime-se mais + Varredura concluída Precisamos fazer uma varredura do seu rosto para verificar se você é uma pessoa real. Carregando Ignorar @@ -170,6 +182,7 @@ O aplicativo pode usar o flash da câmera Iniciar a verificação Este processo foi criado para verificar se é realmente você e para te proteger contra roubo de identidade + Tente novamente Upload bem-sucedido Enviando --> diff --git a/sample/JumioMobileSample/src/main/res/values-pt/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-pt/strings-jumio-sdk.xml index d40d8ade..4535f676 100644 --- a/sample/JumioMobileSample/src/main/res/values-pt/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-pt/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Por favor, verifique se está online Encontrámos um problema de comunicação de rede O acesso à câmara está desativado - Digitalização não disponível neste momento, por favor contacte a equipa de apoio ao cliente + Digitalização não disponível neste momento, por favor contacte a equipa de apoio ao cliente Sessão expirada ID digital Carta de Condução @@ -33,6 +33,8 @@ Tire uma fotografia Alternar câmara A analisar os dados biométricos + Para continuar com o carregamento, certifique-se de que transferiu um PDF da carta de condução digital a partir da aplicação governamental oficial [({Carteira Digital de Trânsito})] + Carregar um PDF da CNH Digital Cancelar Tente novamente Será redirecionado para a seleção de documentos @@ -59,6 +61,7 @@ Certifique-se de que todos os detalhes no seu documento são legíveis A imagem é demasiado desfocada para ser verificada As imagens têm de ser captadas de novo + Certifique-se de que transferiu um PDF da carta de condução digital a partir da aplicação governamental oficial [({Carteira Digital de Trânsito})] Tente novamente com uma imagem a cores A imagem é uma fotocópia a preto e branco A imagem parece ser uma fotocópia a cores @@ -138,6 +141,7 @@ Tire uma selfie Alinhe o seu rosto na moldura oval e prima o botão do disparo Verificação do rosto + Brasil CNH Digital PDF Pesquisar País Selecione o país de emissão Outro formato @@ -148,10 +152,18 @@ País emissor do cheque Selecione o tipo de documento Documentos suportados + Mantenha-se ao centro + Fique imóvel + Levante o rosto + Afaste-se Coloque o seu rosto na moldura - Entendido! Vamos tirar outra foto - Demasiado perto + Vamos fazer outra leitura + Incline para baixo + Incline para a esquerda + Incline para a direita + Incline para cima Aproximar + Digitalização concluída Precisamos de fazer uma digitalização do seu rosto para verificar que é uma pessoa real. A carregar Pular @@ -170,6 +182,7 @@ A aplicação pode usar o flash da câmara Iniciar a verificação Este processo foi criado para confirmar a sua identidade e protegê-lo contra o roubo de identidade + Tente novamente Carregamento bem sucedido A carregar --> diff --git a/sample/JumioMobileSample/src/main/res/values-ro/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-ro/strings-jumio-sdk.xml index c1063ed2..e51ed654 100644 --- a/sample/JumioMobileSample/src/main/res/values-ro/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-ro/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Vă rugăm să vă asigurați că sunteți online Am întâmpinat o problemă la comunicare în rețea Accesul la cameră dezactivat - Procesul de scanare nu este disponibil momentan, vă rugăm să contactați echipa de asistență + Procesul de scanare nu este disponibil momentan, vă rugăm să contactați echipa de asistență Sesiunea a expirat ID digital Permis de conducere @@ -33,6 +33,8 @@ Faceți o fotografie Comutați camera Sunt analizate datele biometrice + Pentru a continua cu încărcarea, asigurați-vă că ați descărcat un permis de conducere digital în format PDF din aplicația oficială a guvernului [({Carteira Digital de Trânsito})] + Încărcați CNH Digital în format PDF Anulare Încercați din nou Veți naviga înapoi la selecția documentului. @@ -59,6 +61,7 @@ Asigurați-vă că toate detaliile de pe documentul dvs. sunt lizibile Imaginea este prea încețoșată pentru a fi verificată O nouă poză a imaginilor trebuie făcută + Asigurați-vă că ați descărcat un permis de conducere digital în format PDF din aplicația oficială a guvernului [({Carteira Digital de Trânsito})] Vă rugăm să încercați din nou cu o imagine color Imaginea este o copie alb-negru Imaginea pare să fie o copie color @@ -138,6 +141,7 @@ Faceți o fotografie a feței Încadrați-vă fața în forma ovală și apăsați pe butonul declanșatorului Verificarea feței + CNH Digital Brazil PDF Căutați țara Selectați țara emitentă Alt format @@ -148,10 +152,18 @@ Verificați țara emitentă Selectați tipul de document Documente acceptate + Mențineți pe centru + Nu vă mișcați + Mențineți drept + Îndepărtați-vă Încadrați-vă fața - Perfect! Să mai facem o poză - Prea aproape + Haideți să mai scanăm o dată + Înclinați în jos + Înclinați la stânga + Înclinați la dreapta + Înclinați în sus Apropiați-vă + Scanare finalizată Trebuie să vă scanăm fața pentru a verifica dacă sunteți o persoană reală. Se încarcă Ocolire @@ -170,6 +182,7 @@ Aplicația poate utiliza blițul camerei Începeți verificarea identității Acest proces de verificare are rolul de a vă confirma identitatea și a vă proteja de furtul de identitate + Încercați din nou Încărcare reușită Încărcare --> diff --git a/sample/JumioMobileSample/src/main/res/values-ru/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-ru/strings-jumio-sdk.xml index 1d0f9a42..60b54b3a 100644 --- a/sample/JumioMobileSample/src/main/res/values-ru/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-ru/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Пожалуйста, убедитесь, что вы онлайн Мы столкнулись с проблемой сетевой связи Доступ к камере отключен - Сканирование сейчас не доступно, пожалуйста, свяжитесь с командой поддержки + Сканирование сейчас не доступно, пожалуйста, свяжитесь с командой поддержки Время сеанса истекло Цифровое удостоверение Водительские права @@ -33,6 +33,8 @@ Сфотографировать Переключить камеру Анализ биометрических данных + Для того, чтобы выполнить загрузку, убедитесь, что вы скачали цифровое водительское удостоверение PDF из официального государственного приложения [({Carteira Digital de Trânsito})] + Загрузить CNH Digital PDF Отменить Повторить Вы вернетесь к выбору документа. @@ -59,6 +61,7 @@ Убедитесь, что все данные на вашем документе читаемы Изображение слишком размытое для проверки Изображения необходимо переснять + Убедитесь, что вы скачали Цифровое водительское удостоверение PDF из официального государственного приложения [({Carteira Digital de Trânsito})] Попробуйте еще раз с цветным изображением Изображение является черно-белой ксерокопией Изображение похоже на цветную ксерокопию @@ -138,6 +141,7 @@ Сделайте селфи Поместите лицо в овальную рамку и нажмите кнопку, чтобы сфотографировать Проверка лица + Бразильский CNH Digital PDF Поиск страны Выберите страну выдачи Другие @@ -148,10 +152,18 @@ Проверьте страну выдачи Выберите тип удостоверения Поддерживаемые документы + Держите по центру + Не двигайтесь + Держите вертикально + Отодвиньте Поместите лицо в рамку - Понятно! Сделаем еще одну попытку - Слишком близко + Сделаем еще одну попытку + Опустите вниз + Наклоните влево + Наклоните вправо + Поднимите вверх Подойдите ближе + Сканирование завершено Нам нужно отсканировать ваше лицо, чтобы убедиться, что вы реальный человек. Загрузка Пропускать @@ -170,6 +182,7 @@ Приложение может использовать вспышку камеры Начать проверку Этот процесс предназначен для проверки вашей личности и защиты от кражи персональных данных + Попробуйте еще раз Загрузка успешно завершена Загрузка --> diff --git a/sample/JumioMobileSample/src/main/res/values-sk/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-sk/strings-jumio-sdk.xml index b67e2c4c..9d9b1305 100644 --- a/sample/JumioMobileSample/src/main/res/values-sk/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-sk/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Skontrolujte svoje pripojenie Vyskytli sa problémy so sieťovou komunikáciou Prístup k fotoaparátu je zamietnutý - Skenovanie nie je momentálne k dispozícii, obráťte sa na tím podpory + Skenovanie nie je momentálne k dispozícii, obráťte sa na tím podpory Platnosť relácie vypršala Digitálny identifikátor Vodičský preukaz @@ -33,6 +33,8 @@ Zhotoviť fotografiu Prepnutie fotoaparátu Analýza biometrických údajov + Než začnete s nahrávaním, uistite sa, že ste si stiahli dokument PDF s digitálnym vodičským preukazom z oficiálnej štátnej aplikácie [({Carteira Digital de Trânsito})] + Nahrajte PDF s dokumentom CNH Digital Zrušiť Skúste znova Prejdete späť na výber dokumentu. @@ -59,6 +61,7 @@ Uistite sa, že všetky údaje na vašom preukaze totožnosti sú čitateľné Fotografia je príliš rozmazaná na overenie Fotografie je potrebné urobiť znovu + Uistite sa, že ste si stiahli PDF s digitálnym vodičským preukazom z oficiálnej štátnej aplikácie [({Carteira Digital de Trânsito})] Skúste to znova s farebným obrázkom Obrázok je čiernobielou fotokópiou Obrázok vyzerá ako farebná fotokópia @@ -138,6 +141,7 @@ Urobte si selfie Zarovnajte tvár s oválnym rámom a stlačte spúšť Overenie tváre + Brazilské CNH Digital PDF Vyhľadať krajinu Vyberte vydávajúcu krajinu Iný formát @@ -148,10 +152,18 @@ Skontrolujte vydávajúcu krajinu Vyberte typ preukazu Podporované dokumenty + Umiestnite hlavu do stredu + Nehýbte sa + Držte hlavu rovno + Vzdiaľte sa Umiestnite tvár do rámika - Hotovo! Zhotovte ešte jednu snímku - Príliš blízko + Zhotovte ešte jednu snímku + Skloňte hlavu + Nakloňte sa doľava + Nakloňte sa doprava + Zdvihnite hlavu Pristúpte bližšie + Skenovanie bolo dokončené Musíme naskenovať vašu tvár, aby sme si overili, že ste skutočná osoba. Načítavanie Preskočiť @@ -168,8 +180,9 @@ Použiť platný dokument Použite platný preukaz totožnosti vydaný štátom Aplikácia môže používať blesk - Začať s overovaním + Začať overovanie Tento proces je určený na potvrdenie vašej totožnosti a na vašu ochranu pred krádežou totožnosti + Skúste to znova Nahrávanie úspešné Nahrávanie --> diff --git a/sample/JumioMobileSample/src/main/res/values-sl/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-sl/strings-jumio-sdk.xml index a2a8a334..94bd7d6e 100644 --- a/sample/JumioMobileSample/src/main/res/values-sl/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-sl/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Preverite, ali ste povezani v internet Naleteli smo na težavo z omrežno komunikacijo Dostop do kamere je onemogočen. - Optično branje trenutno ni na voljo, obrnite se na podporno ekipo + Optično branje trenutno ni na voljo, obrnite se na podporno ekipo Seja potekla Digitalna identiteta Vozniško dovoljenje @@ -33,6 +33,8 @@ Posnemi fotografijo Preklopi kamero Analiziranje biometričnih podatkov + Za nadaljevanje z nalaganjem se prepričajte, da ste datoteko PDF z elektronskim vozniškim dovoljenjem prenesli iz uradne državne aplikacije [({Carteira Digital de Trânsito})]. + Naloži PDF CNH Digital Prekliči Poskusite znova Preusmerjeni boste nazaj na izbiro dokumenta. @@ -59,6 +61,7 @@ Poskrbite, da so vsi podatki na vašem dokumentu čitljivi Slika ni dovolj ostra za preverjanje Slika mora biti ponovno posneta + Prepričajte se, da ste datoteko PDF z elektronskim vozniškim dovoljenjem prenesli iz uradne državne aplikacije [({Carteira Digital de Trânsito})]. Poskusite znova z barvno sliko Slika je črno-bela fotokopija Videti je, da je slika barvna fotokopija @@ -138,6 +141,7 @@ Posnemi fotografijo samega sebe Obraz postavite v ovalni okvir in pritisnite gumb sprožilca Preverjanje obraza + Brazil CNH Digital PDF Išči državo Izberite državo izdajateljico Druga oblika @@ -148,10 +152,18 @@ Preverite državo izdajateljico Izberite vrsto osebnega dokumenta Podprti dokumenti + Glava na sredini + Stojte pri miru + Glava zravnano + Premakni na stran Obraz postavite v okvir - Razumem! Poskusimo še enkrat - Preblizu + Skenirajmo še enkrat + Nagni navzdol + Nagni v levo + Nagni v desno + Nagni navzgor Približajte se + Optično branje končano Da bi preverili, ali ste resnična oseba, moramo skenirati vaš obraz. Nalaganje Preskoči @@ -170,6 +182,7 @@ Aplikacija lahko uporablja bliskavico fotoaparata Začetek preverjanja Ta postopek je namenjen preverjanju vaše identitete in zaščiti pred krajo identitete + Poskusite znova Nalaganje uspešno Nalaganje --> diff --git a/sample/JumioMobileSample/src/main/res/values-sr/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-sr/strings-jumio-sdk.xml index 2e5e93f7..8b7a4cb4 100644 --- a/sample/JumioMobileSample/src/main/res/values-sr/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-sr/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Проверите да ли сте на мрежи Наишли смо на проблем мрежне комуникације Приступ камери онемогућен - Скенирање тренутно није доступно, обратите се тиму за подршку + Скенирање тренутно није доступно, обратите се тиму за подршку Сесија је истекла Дигитални ID Возачка дозвола @@ -33,6 +33,8 @@ Фотографиши Пребаци камеру Анализирање биометријских података + Да бисте наставили са отпремањем, уверите се да сте преузели дигиталну возачку дозволу у PDF-у са званичне владине апликације [({Carteira Digital de Trânsito})] + Отпремите CNH Digital PDF Откажи Покушај поново Бићете враћени на избор докумената. @@ -59,6 +61,7 @@ Уверите се да су сви детаљи у вашем документу читљиви Слика је превише мутна за верификацију Слике морају бити поново фотографисане + Уверите се да сте преузели дигиталну возачку дозволу у PDF-у са званичне владине апликације [({Carteira Digital de Trânsito})] Покушајте поново са сликом у боји Слика је црно-бела фотокопија Изгледа да је слика фотокопија у боји @@ -138,6 +141,7 @@ Снимите селфи Поравнајте лице у овалном оквиру и притисните окидач Верификација лица + Бразилска CNH Digital PDF Претражи земљу Изаберите земљу издавања Други формат @@ -148,10 +152,18 @@ Проверите земљу издавања Изаберите тип документа Подржани документи + Држите се у средини + Будите мирни + Држите главу усправно + Склоните се Ставите своје лице у оквир - Разумем! Направимо још један снимак - Преблизу + Направимо још један снимак + Померите се надоле + Окрените се улево + Окрените се удесно + Померите се нагоре Приближите се + Скенирање је завршено Морамо да вам скенирамо лице да бисмо потврдили да сте стварна особа. Учитавање Прескочи @@ -170,6 +182,7 @@ Апликација може да користи блиц камере Почни верификацију Овај процес је дизајниран да потврди ваш идентитет и заштити вас од крађе идентитета + Покушајте поново Отпремање је успешно Отпремање --> diff --git a/sample/JumioMobileSample/src/main/res/values-sv/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-sv/strings-jumio-sdk.xml index cb79be9d..dfa5c734 100644 --- a/sample/JumioMobileSample/src/main/res/values-sv/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-sv/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Kontrollera att du är online Nätverket har stött på ett kommunikationsproblem Kameraåtkomst inaktiverad - Skanning är inte tillgänglig just nu. Kontakta supportteamet + Skanning är inte tillgänglig just nu. Kontakta supportteamet Sessionen har löpt ut Digitalt ID Körkort @@ -33,6 +33,8 @@ Ta ett foto Växla kamera Analyserar biometriska data + För att fortsätta med uppladdningen, se till att du har laddat ner ett digitalt körkort i PDF-format från den officiella myndighetsapplikationen [({Carteira Digital de Trânsito})] + Ladda upp CNH Digital (PDF) Avbryt Försök igen Du kommer att återvända till dokumentval. @@ -59,6 +61,7 @@ Kontrollera att alla uppgifter på ditt dokument är läsbara Bilden är för oskarp för att verifieras Bilder måste tas om + Se till att du har laddat ner ett digitalt körkort i PDF-format från den officiella myndighetsapplikationen [({Carteira Digital de Trânsito})] Försök igen med en färgbild Bilden är en svartvit kopia Bilden verkar vara en färgkopia @@ -138,6 +141,7 @@ Ta en selfie Rama in ditt ansikte i den ovala ramen och tryck på slutarknappen Ansiktsverifiering + Brasilien CNH Digital PDF Sök land Välj utfärdande land Annat format @@ -148,10 +152,18 @@ Kontrollera utfärdande land Välj typ av ID-handling Stödda dokument + Håll dig centrerad + Håll stadigt + Håll dig upprätt + Flytta dig bakåt Rama in ansiktet - Okej! Gör ett nytt försök - För nära + Låt oss göra en ny skanning + Luta nedåt + Luta åt vänster + Luta åt höger + Luta uppåt Flytta närmare + Skanningen är klar Vi måste skanna ditt ansikte för att verifiera att du är en riktig person. Laddar Hoppa @@ -170,6 +182,7 @@ Appen kan använda kamerablixten Starta verifiering Den här processen är till för att bekräfta din identitet och skydda dig mot identitetsstöld + Försök igen Uppladdning klar Laddar upp --> diff --git a/sample/JumioMobileSample/src/main/res/values-th/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-th/strings-jumio-sdk.xml index d16c5672..eeecbba7 100644 --- a/sample/JumioMobileSample/src/main/res/values-th/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-th/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ โปรดตรวจสอบว่าคุณออนไลน์อยู่ เราพบปัญหาการสื่อสารเครือข่าย การเข้าถึงกล้องถูกปิดใช้งาน - ไม่สามารถสแกนได้ในขณะนี้ โปรดติดต่อทีมสนับสนุน + ไม่สามารถสแกนได้ในขณะนี้ โปรดติดต่อทีมสนับสนุน เซสชันหมดอายุ เอกสารประจำตัวดิจิทัล ใบขับขี่ @@ -33,6 +33,8 @@ ถ่ายรูป สลับกล้อง กำลังวิเคราะห์ข้อมูลชีวมิติ + หากต้องการดำเนินการอัปโหลด ตรวจสอบให้แน่ใจว่าคุณได้ดาวน์โหลดใบอนุญาตขับขี่ดิจิทัล PDF จากแอปพลิเคชันของรัฐบาลอย่างเป็นทางการแล้ว [({Carteira Digital de Trânsito})] + อัปโหลดไฟล์ PDF ของ CNH Digital ยกเลิก ลองอีกครั้ง เราจะพาคุณกลับไปเลือกเอกสาร @@ -59,6 +61,7 @@ ตรวจสอบให้แน่ใจว่ารายละเอียดทั้งหมดในเอกสารของคุณนั้นอ่านออก ภาพพร่ามัวเกินกว่าที่จะตรวจสอบได้ ต้องถ่ายรูปใหม่ + ตรวจสอบให้แน่ใจว่าคุณได้ดาวน์โหลดใบอนุญาตขับขี่ดิจิทัลในรูปแบบ PDF จากแอปพลิเคชันของรัฐบาลอย่างเป็นทางการแล้ว [({Carteira Digital de Trânsito})] โปรดลองอีกครั้งด้วยภาพสี รูปภาพเป็นสำเนาสีขาวดำ รูปภาพดูเหมือนจะเป็นสำเนาสี @@ -138,6 +141,7 @@ ถ่ายภาพตัวเอง จัดใบหน้าของคุณในกรอบวงรีแล้วกดปุ่มชัตเตอร์ การตรวจสอบใบหน้า + CNH Digital บราซิล PDF ค้นหาประเทศ เลือกประเทศที่ออกเอกสาร รูปแบบอื่น ๆ @@ -148,10 +152,18 @@ ตรวจสอบประเทศที่ออกเอกสาร เลือกประเภทเอกสาร เอกสารที่รองรับ + จัดตำแหน่งให้อยู่ตรงกลาง + อยู่นิ่งๆ + จัดตำแหน่งให้ตั้งตรง + ขยับออก วางให้ใบหน้าอยู่ในกรอบ - เข้าใจแล้ว! มาถ่ายรูปกันอีกสักรอบเถอะนะ - ใกล้เกินไป + ลองสแกนอีกครั้ง + ก้มลง + เอียงซ้าย + เอียงขวา + เงยขึ้น เข้ามาใกล้ + การสแกนเสร็จสมบูรณ์ คุณจะต้องสแกนใบหน้าของคุณเพื่อยืนยันว่าคุณเป็นคนจริงๆ กำลังโหลด ข้าม @@ -170,6 +182,7 @@ แอปอาจใช้แฟลชกล้อง เริ่มการตรวจสอบ ขั้นตอนการตรวจสอบนี้ออกแบบมาเพื่อยืนยันตัวตนของคุณและปกป้องคุณจากการขโมยอัตลักษณ์ + โปรดลองอีกครั้ง อัปโหลดสำเร็จ กำลังอัปโหลด --> diff --git a/sample/JumioMobileSample/src/main/res/values-tr-rTR/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-tr-rTR/strings-jumio-sdk.xml index a39216d0..83406f50 100644 --- a/sample/JumioMobileSample/src/main/res/values-tr-rTR/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-tr-rTR/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Lütfen çevrimiçi olduğunuzu kontrol edin Bir ağ iletişimi sorunuyla karşılaştık Kamera erişimi devre dışı - Tarama şu anda kullanılamıyor, lütfen destek ekibi ile iletişime geçin. + Tarama şu anda kullanılamıyor, lütfen destek ekibi ile iletişime geçin. Oturum Sona Erdi. Dijital kimlik Sürücü Belgesi @@ -33,6 +33,8 @@ Fotoğraf çek Kamerayı değiştir Biyometrik veriler inceleniyor + Yükleme işlemine devam etmek için resmi devlet uygulaması üzerinden dijital ehliyet PDF\'sini [({Carteira Digital de Trânsito})] indirmiş olmanız gerekmektedir + CNH Digital PDF\'sini yükleyin İptal Tekrar deneyin Belge seçme ekranına geri döndürüleceksiniz. @@ -59,6 +61,7 @@ Belgenizdeki tüm ayrıntıların okunabilir olduğuna emin olun Görüntü doğrulanamayacak kadar bulanık Görüntüler yeniden çekilmelidir + Resmi devlet uygulaması üzerinden Dijital ehliyet PDF\'sini [({Carteira Digital de Trânsito})] indirmeyi unutmayın Lütfen renkli bir görüntüyle tekrar deneyin Bu görüntü siyah beyaz bir fotokopi Bu görüntü renkli bir fotokopi gibi görünüyor @@ -138,6 +141,7 @@ Selfie çekin Yüzünüzü oval çerçeveye hizalayın ve fotoğraf çekme düğmesine basın Yüz Doğrulama + Brezilya CNH Digital PDF\'si Ülke Arayın Belgeyi veren ülkeyi seçin Diğer biçim @@ -148,10 +152,18 @@ Belgeyi veren ülkeyi kontrol edin Belge türünü seçin Desteklenen belgeler + Ortalayın + Sabit durun + Dik tutun + Uzaklaşın Yüzünüzü çerçeveye ortalayın - Anladım! Bir tane daha çekelim - Çok yakın + Bir tarama daha yapalım + Aşağı eğin + Sola eğin + Sağa eğin + Yukarı kaldırın Yaklaşın + Tarama tamamlandı Gerçek bir insan olduğunuzu doğrulamak için yüzünüzü taramamız gerekiyor. Yükleniyor Atla @@ -170,6 +182,7 @@ Uygulama kamera flaşını kullanabilir Doğrulamayı başlat Bu süreç, kimliğinizi doğrulamak ve sizi kimlik hırsızlığına karşı korumak için tasarlanmıştır + Tekrar deneyin Yükleme başarılı Yükleniyor --> diff --git a/sample/JumioMobileSample/src/main/res/values-uk-rUA/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-uk-rUA/strings-jumio-sdk.xml index 47222c92..92e8bd52 100644 --- a/sample/JumioMobileSample/src/main/res/values-uk-rUA/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-uk-rUA/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Переконайтеся, що ви в мережі Ми зіткнулися з проблемою мережевого зв\'язку Доступ до камери деактивовано - Сканування наразі недоступне, зверніться до служби підтримки + Сканування наразі недоступне, зверніться до служби підтримки Сеанс закінчився Цифровий документ, що посвідчує особу Посвідчення водія @@ -33,6 +33,8 @@ Зробити фото Перемкнути камеру Триває аналіз біометричних даних + Щоб продовжити завантаження, переконайтеся, що ви завантажили PDF-файл цифрових водійських прав з офіційного урядового застосунку [({Carteira Digital de Trânsito})] + Завантажити CNH Digital PDF Скасувати Повторити спробу Ви повернетеся до вибору документу. @@ -59,6 +61,7 @@ Переконайтеся, що всі деталі вашого документа розбірливі Зображення надто розмите для перевірки Зображення необхідно перезняти + Переконайтеся, що ви завантажили PDF-файл цифрових водійських прав з офіційного державного застосунку [({Carteira Digital de Trânsito})] Будь ласка, повторіть спробу з кольоровим зображенням Зображення є чорно-білою фотокопією Зображення схоже на кольорову фотокопію @@ -138,6 +141,7 @@ Зробіть селфі Вирівняйте обличчя в овальній рамці та натисніть кнопку затвора Перевірка обличчя + Бразильський CNH Digital PDF Пошук країни Виберіть країну, де був виданий документ Інший формат @@ -148,10 +152,18 @@ Перевірте країну, де був виданий документ Виберіть тип документа Підтримувані документи + Тримайте у центрі + Не рухайтесь + Тримайте вертикально + Відсуньтеся Розташуйте обличчя у рамці - Зрозуміло! Зробимо ще раз - Надто близько + Зробімо ще одне сканування + Нахиліть униз + Нахиліть ліворуч + Нахиліть праворуч + Нахиліть угору Підсуньтесь ближче + Сканування завершено Нам потрібно просканувати ваше обличчя, щоб переконатися, що ви реальна людина. Завантаження Пропустити @@ -168,8 +180,9 @@ Використовуйте дійсний документ Використовуйте дійсний документ, виданий державним органом Застосунок може використовувати спалах камери - Почніть перевірку + Почати перевірку Цей процес призначений для перевірки вашої особи та захисту від крадіжки персональних даних + Повторіть спробу Вивантаження успішно виконано Вивантаження --> diff --git a/sample/JumioMobileSample/src/main/res/values-vi/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-vi/strings-jumio-sdk.xml index e03bef72..fff68132 100644 --- a/sample/JumioMobileSample/src/main/res/values-vi/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-vi/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Vui lòng kiểm tra xem bạn có trực tuyến không Chúng tôi đã gặp sự cố về giao tiếp mạng Quyền truy cập máy ảnh bị vô hiệu hóa - Tính năng quét không khả dụng vào lúc này, vui lòng liên hệ với nhóm hỗ trợ + Tính năng quét không khả dụng vào lúc này, vui lòng liên hệ với nhóm hỗ trợ Phiên hết hạn ID kỹ thuật số Giấy phép lái xe @@ -33,6 +33,8 @@ Chụp ảnh Chuyển đổi máy ảnh Đang phân tích dữ liệu sinh trắc học + Để tiếp tục tải lên, vui lòng đảm bảo rằng bạn đã tải xuống Giấy phép lái xe kỹ thuật số ở định dạng PDF từ ứng dụng chính thức của chính phủ [({Carteira Digital de Trânsito})] + Tải lên bản PDF của CNH Digital Hủy Thử lại Bạn sẽ được điều hướng trở lại lựa chọn tài liệu. @@ -59,6 +61,7 @@ Đảm bảo rằng tất cả các chi tiết trên tài liệu của bạn đều có thể đọc được Hình ảnh quá mờ để có thể xác minh Hình ảnh phải được chụp lại + Vui lòng đảm bảo rằng bạn đã tải xuống Giấy phép lái xe kỹ thuật số định dạng PDF từ ứng dụng chính thức của chính phủ [({Carteira Digital de Trânsito})] Vui lòng thử lại với một hình ảnh màu Hình ảnh là một bản photocopy đen trắng Hình ảnh có vẻ là một bản photocopy màu @@ -93,7 +96,7 @@ Tháo kính râm Di chuyển đến một nơi tối hơn Di chuyển đến một nơi sáng hơn - Giữ khuôn mặt không di chuyển + Giữ yên Mắt bị nhắm lại Xác minh khuôn mặt không thành công Đã phát hiện nhiều người @@ -138,6 +141,7 @@ Chụp ảnh tự chụp Căn chỉnh khuôn mặt của bạn trong khung hình bầu dục và nhấn nút chụp Xác minh khuôn mặt + PDF CNH Digital Brazil Tìm kiếm quốc gia Chọn quốc gia phát hành Định dạng khác @@ -148,10 +152,18 @@ Đang kiểm tra quốc gia phát hành Chọn loại ID Tài liệu được hỗ trợ + Giữ ở vị trí trung tâm + Giữ yên + Giữ thẳng + Di chuyển ra xa Kéo mặt bạn vào khung - Đã hiểu! Hãy chụp một bức ảnh khác - Quá gần + Hãy quét lần nữa + Nghiêng xuống + Nghiêng trái + Nghiêng phải + Nghiêng lên Di chuyển lại gần hơn + Đã quét xong Chúng tôi cần quét khuôn mặt bạn để xác minh rằng bạn là người thật. Đang tải Nhảy @@ -170,6 +182,7 @@ Ứng dụng có thể sử dụng đèn flash của camera Bắt đầu xác minh Quy trình này được thiết kế để xác minh danh tính của bạn và giúp bạn không bị đánh cắp danh tính + Vui lòng thử lại Tải lên thành công Đang tải lên --> @@ -196,7 +209,7 @@ Tháo kính râm Di chuyển đến một nơi tối hơn Di chuyển đến một nơi sáng hơn - Giữ khuôn mặt không di chuyển + Giữ yên Thử lại Phiên của bạn đã hết hạn Đánh giá sự hiện diện thực sự… diff --git a/sample/JumioMobileSample/src/main/res/values-zh-rTW/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-zh-rTW/strings-jumio-sdk.xml index b626b131..dc2cc1ff 100644 --- a/sample/JumioMobileSample/src/main/res/values-zh-rTW/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-zh-rTW/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ 請檢查您是否處於線上狀態 我們遇到了網路通訊問題 相機存取權限已停用 - 目前無法掃描,請聯絡支援團隊 + 目前無法掃描,請聯絡支援團隊 工作階段已過期 數位 ID 駕駛執照 @@ -33,6 +33,8 @@ 拍照 切換相機 正在分析生物特徵資料 + 若要繼續上傳,請確保您已從官方政府應用程式 [({Carteira Digital de Trânsito})] 下載數位駕照 PDF + 上傳 CNH Digital PDF 取消 再試一次 您將導覽回文件選擇。 @@ -59,6 +61,7 @@ 確保文件的所有詳細資料均可讀取 圖像過於模糊,無法進行驗證 必須重新拍攝圖像 + 確保您已從官方政府應用程式 [({Carteira Digital de Trânsito})] 下載數位駕照 PDF 請使用彩色圖片重試 圖片為黑白影印 圖片似乎是彩色影印件 @@ -138,6 +141,7 @@ 自拍 將您的臉部對準橢圓形框,然後按下快門按鈕 面部驗證 + 巴西CNH Digital PDF 搜尋國家/地區 選擇簽發的國家/地區 其他格式 @@ -148,10 +152,18 @@ 檢查簽發的國家/地區 選擇文件類型 支援的文件 + 保持居中 + 保持不動 + 保持直立 + 跑出框外了 將您的面部置於框內 - 瞭解!讓我們再拍一張 - 太近 + 請再拍一張 + 向下低頭 + 向左邊一點 + 向右邊一點 + 向上抬頭 靠近一點 + 掃描完成 我們需要掃描您的臉部,以驗證您是真人。 載入中 跳躍 @@ -170,6 +182,7 @@ 該應用程式可能需要使用相機閃光燈 開始驗證 此程序旨在驗證您的身分並保護您免遭身分盜用 + 請再試一次 上傳成功 上傳中 --> diff --git a/sample/JumioMobileSample/src/main/res/values-zh/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-zh/strings-jumio-sdk.xml index 234fa3b0..9a214985 100644 --- a/sample/JumioMobileSample/src/main/res/values-zh/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-zh/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ 请检查您是否在线 我们遇到了网络通信问题 摄像头访问权限被禁用 - 目前无法扫描,请联系支持团队 + 目前无法扫描,请联系支持团队 会话已过期 数字身份 驾驶证 @@ -33,6 +33,8 @@ 拍一张照片 开启摄像头 正在分析生物计量数据 + 要继续上传,请确保您已从政府官方应用程序下载数字驾照 PDF [({Carteira Digital de Trânsito})] + 上传 CNH Digital PDF 取消 重试 您将导航回文档选择。 @@ -59,6 +61,7 @@ 请确保证件的所有详情均清晰可读 照片太模糊,无法验证 照片必须重拍 + 确保您已从政府官方应用程序下载数字驾照 PDF [({Carteira Digital de Trânsito})] 请使用彩色图像重试 图像是黑白复印件 图像似乎是彩色复印件 @@ -138,6 +141,7 @@ 拍一张自拍照 请将脸部对准椭圆形框,然后按下快门按钮 面部验证 + 巴西CNH Digital PDF 搜索国家 选择签发国家 其他格式 @@ -148,10 +152,18 @@ 检查签发国家 选择证件类型 支持的文档 + 保持居中 + 保持不动 + 保持端正 + 离远一点 将面部放在框中 - 明白!再试一次吧 - 太近了 + 请再拍一张 + 向下倾斜 + 向左倾斜 + 向右倾斜 + 向上倾斜 靠近一点 + 扫描完成 我们需要扫描您的面部,验证您是否为真人。 加载中 跳跃 @@ -170,6 +182,7 @@ 应用可能会使用相机闪光灯 开始身份认证 此认证过程旨在确认您的身份并保护您免遭身份盗用 + 请重试 上传成功 正在上传 --> diff --git a/sample/JumioMobileSample/src/main/res/values-zu/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values-zu/strings-jumio-sdk.xml index 3c0c0571..8b376ca8 100644 --- a/sample/JumioMobileSample/src/main/res/values-zu/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values-zu/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Sicela uhlole ukuthi uxhumile yini ku-inthanethi Sithole inkinga yokuxhumana kwenethiwekhi Ukusebenzisa ikhamera kuvaliwe - Ukuskena akukho okwamanje, sicela uxhumane nethimba losizo + Ukuskena akukho okwamanje, sicela uxhumane nethimba losizo Isikhathi Siphelile I-ID Eyidijithali Ilayisensi Yokushayela @@ -33,6 +33,8 @@ Thatha isithombe Shintsha ikhamera yakho Ihlaziya idatha ye-biometric + Ukuze uqhubeke nokulayisha, qinisekisa ukuthi udawunilode i-PDF yelayisensi yokushayela eyidijithali ku-aplikheshini esemthethweni kahulumeni [({Carteira Digital de Trânsito})] + Layisha i-PDF ye-CNH Eyidijithali Khansela Zama futhi Uzozulazula ubuyele ekukhethweni kwedokhumenti @@ -59,6 +61,7 @@ Qinisekisa ukuthi yonke imininingwane ekudokhumenti lakho iyafundeka Isithombe siluvindo kakhulu ukuthi siqinisekiswe Izithombe kumelwe zithathwe kabusha + Qinisekisa ukuthi udawunilode i-PDF yelayisensi yokushayela Eyidijithali ku-aplikheshini esemthethweni kahulumeni [({Carteira Digital de Trânsito})] Sicela uphinde uzame ngesithombe esinombala Isithombe siyikhophi engenawo umbala Isithombe sibonakala siyikhophi enombala @@ -138,6 +141,7 @@ Thatha i-selfie Qondanisa ubuso bakho bungene endilingeni esaqanda bese ucindezela inkinobho yokuthwebula Ukuqinisekisa Ubuso + I-Brazil CNH Digital PDF Funa Izwe Khetha izwe elikhiphile Enye ifomethi @@ -148,10 +152,18 @@ Hlola izwe elikhiphile Khetha uhlobo lwedokhumenti Ama-dokhumenti akhokhelwayo + Bugcine bumaphakathi + Yima unganyakazi + Bugcine buqondile + Hlehlela Emuva Beka ubuso bakho ohlakeni - Ngiyaqonda! Masithathe esinye isithombe - Useduze kakhulu + Masithathe esinye iskeni + Butshekisele ezansi + Butshekisele kwesokunxele + Butshekisele kwesokudla + Butshekisele phezulu Sondela + Ukuskena kuphelile Kudingeka siskene ubuso bakho ukuze siqinisekise ukuthi ungumuntu ongokoqobo. Iyaloda Yeqa @@ -170,6 +182,7 @@ I-app ingase isebenzise i-flash yekhamera Qala ukuqinisekisa Le nqubo iklanyelwe ukuqinisekisa ubuwena futhi ikuvikele ekwebiweni komazisi wakho + Sicela uphinde uzame Ukufaka kuphumelele Iyafaka --> diff --git a/sample/JumioMobileSample/src/main/res/values/colors.xml b/sample/JumioMobileSample/src/main/res/values/colors.xml index bbe73c56..1a15ee21 100644 --- a/sample/JumioMobileSample/src/main/res/values/colors.xml +++ b/sample/JumioMobileSample/src/main/res/values/colors.xml @@ -6,4 +6,5 @@ #1C2229 #FFFFFF + #000000 diff --git a/sample/JumioMobileSample/src/main/res/values/strings-jumio-sdk.xml b/sample/JumioMobileSample/src/main/res/values/strings-jumio-sdk.xml index 4267525c..c33581ab 100644 --- a/sample/JumioMobileSample/src/main/res/values/strings-jumio-sdk.xml +++ b/sample/JumioMobileSample/src/main/res/values/strings-jumio-sdk.xml @@ -13,7 +13,7 @@ Please check that you are online We have encountered a network communication problem Camera access disabled - Scanning not available at this time, please contact the support team + Scanning not available at this time, please contact the support team Session Expired Digital ID Driver License @@ -33,6 +33,8 @@ Take a photo Switch camera Analyzing biometric data + To proceed with the upload, make sure you have downloaded a digital driver’s license PDF from the official government application [({Carteira Digital de Trânsito})] + Upload a CNH Digital PDF Cancel Try again You will be returned to document selection. @@ -59,6 +61,7 @@ Make sure all details on your document are readable The image is too blurry to be verified Images must be retaken + Make sure you have downloaded a digital driver’s license PDF from the official government application [({Carteira Digital de Trânsito})] Please try again with a color image The image is a black and white photocopy The image appears to be a color photocopy @@ -83,7 +86,7 @@ The image quality is not good enough to be verified Image must be retaken List of supported documents - The document is not supported + The captured document is not supported Keep your eyes open Hold device at eye level Center your face in the frame and follow the on-screen instructions @@ -138,6 +141,7 @@ Take a selfie Align your face in the oval frame and press the shutter button Face Verification + Brazil CNH Digital PDF Search Country Select issuing country Other Format @@ -148,10 +152,18 @@ Check issuing country Select document type Supported documents + Keep centered + Keep still + Keep upright + Move away Put your face in the frame - Got it! Let\'s take another shot - Too close + Let\'s take another scan + Tilt down + Tilt left + Tilt right + Tilt up Move closer + Scanning completed We need to take a scan of your face to verify that you are a real person. Loading Skip @@ -170,6 +182,7 @@ The app may use the camera flash Start Verification This process is designed to verify your identity and protect you from identity theft + Please try again Upload successful Uploading --> diff --git a/sample/JumioMobileSample/src/main/res/values/strings.xml b/sample/JumioMobileSample/src/main/res/values/strings.xml index d94c052a..fccfc571 100644 --- a/sample/JumioMobileSample/src/main/res/values/strings.xml +++ b/sample/JumioMobileSample/src/main/res/values/strings.xml @@ -19,4 +19,41 @@ EU SG + + Start Custom UI + Start Default UI + Jumio Sample App + Token + Enter your token + This workflow consists of: + Loading… + Uploading… + Verifying… + START + Close + back + Select Country + Select Document + Fallback + Camera + Flash + Take + Select acquire mode + RETAKE + CONFIRM + Reject + Thanks for scanning! + Done + ID + FACE + DOCUMENT + Processing… + Retry + Credentials + FLIP DOCUMENT + Requirements + Select a file + NFC Scan Finished + ERROR + Cancel \ No newline at end of file diff --git a/sample/JumioMobileSample/src/main/res/values/styles.xml b/sample/JumioMobileSample/src/main/res/values/styles.xml index 0d6187ff..b728f26d 100644 --- a/sample/JumioMobileSample/src/main/res/values/styles.xml +++ b/sample/JumioMobileSample/src/main/res/values/styles.xml @@ -36,6 +36,7 @@ #EC407A #EC407A #F2F233 + #00B0FF #bc2e41 #57ffc7