11package com.regula.documentreader
22
33import android.Manifest
4+ import android.animation.ValueAnimator
5+ import android.animation.ValueAnimator.AnimatorUpdateListener
46import android.app.Activity
57import android.content.Intent
68import android.content.pm.PackageManager
@@ -14,6 +16,7 @@ import android.text.style.AbsoluteSizeSpan
1416import android.text.style.ForegroundColorSpan
1517import android.text.style.StyleSpan
1618import android.view.*
19+ import android.view.animation.AccelerateInterpolator
1720import android.widget.*
1821import androidx.activity.result.contract.ActivityResultContracts
1922import androidx.appcompat.app.AlertDialog
@@ -30,30 +33,37 @@ import com.regula.documentreader.Helpers.Companion.PERMISSIONS_REQUEST_READ_EXTE
3033import com.regula.documentreader.Helpers.Companion.colorString
3134import com.regula.documentreader.Helpers.Companion.drawable
3235import com.regula.documentreader.Helpers.Companion.getBitmap
36+ import com.regula.documentreader.Scan.Companion.ACTION_TYPE_CUSTOM
3337import com.regula.documentreader.Scan.Companion.ACTION_TYPE_GALLERY
3438import com.regula.documentreader.Scan.Companion.ACTION_TYPE_MANUAL_MULTIPAGE_MODE
3539import com.regula.documentreader.Scan.Companion.ACTION_TYPE_ONLINE
3640import com.regula.documentreader.SettingsActivity.Companion.functionality
3741import com.regula.documentreader.SettingsActivity.Companion.isDataEncryptionEnabled
3842import com.regula.documentreader.SettingsActivity.Companion.isRfidEnabled
3943import com.regula.documentreader.SettingsActivity.Companion.useCustomRfidActivity
40- import com.regula.documentreader.api.DocumentReader
4144import com.regula.documentreader.api.DocumentReader.Instance
4245import com.regula.documentreader.api.completions.IDocumentReaderCompletion
4346import com.regula.documentreader.api.completions.IDocumentReaderPrepareCompletion
4447import com.regula.documentreader.api.enums.DocReaderAction
4548import com.regula.documentreader.api.enums.FrameShapeType
46- import com.regula.documentreader.api.enums.eRFID_Password_Type
47- import com.regula.documentreader.api.enums.eVisualFieldType
49+ import com.regula.documentreader.api.enums.eRPRM_Lights
4850import com.regula.documentreader.api.errors.DocumentReaderException
4951import com.regula.documentreader.api.params.DocReaderConfig
52+ import com.regula.documentreader.api.params.ImageInputData
5053import com.regula.documentreader.api.parser.DocReaderResultsJsonParser
5154import com.regula.documentreader.api.results.DocumentReaderResults
5255import com.regula.documentreader.databinding.ActivityMainBinding
56+ import org.json.JSONException
5357import org.json.JSONObject
5458import java.io.Serializable
59+ import java.text.SimpleDateFormat
60+ import java.util.*
61+
5562
5663class MainActivity : FragmentActivity (), Serializable {
64+ private var mTimerAnimator: ValueAnimator ? = null
65+ private var isAnimationStarted: Boolean = false
66+
5767 @Transient
5868 private lateinit var binding: ActivityMainBinding
5969
@@ -213,8 +223,15 @@ class MainActivity : FragmentActivity(), Serializable {
213223
214224 @Transient
215225 private val completion = IDocumentReaderCompletion { action, results, error ->
226+ if (! isAnimationStarted) {
227+ mTimerAnimator?.let {
228+ it.start()
229+ isAnimationStarted = true ;
230+ }
231+ }
216232 if (action == DocReaderAction .COMPLETE ) {
217233 hideDialog()
234+ cancelAnimation()
218235 if (Instance ().functionality().isManualMultipageMode) {
219236 if (results?.morePagesAvailable != 0 ) {
220237 Instance ().startNewPage()
@@ -244,9 +261,14 @@ class MainActivity : FragmentActivity(), Serializable {
244261 Instance ().functionality().edit().setManualMultipageMode(false ).apply ()
245262
246263 Toast .makeText(this , " Scanning was cancelled" , Toast .LENGTH_LONG ).show()
264+ hideDialog()
265+ cancelAnimation()
247266 }
248- else if (action == DocReaderAction .ERROR )
267+ else if (action == DocReaderAction .ERROR ) {
249268 Toast .makeText(this , " Error:$error " , Toast .LENGTH_LONG ).show()
269+ hideDialog()
270+ cancelAnimation()
271+ }
250272 }
251273
252274 private fun displayResults (documentReaderResults : DocumentReaderResults ) {
@@ -348,6 +370,9 @@ class MainActivity : FragmentActivity(), Serializable {
348370 Helpers .setFunctionality(functionality)
349371 })
350372 rvData.add(Scan (" Gallery (recognizeImage)" , ACTION_TYPE_GALLERY ))
373+ rvData.add(Scan (" Recognize images with light type" , ACTION_TYPE_CUSTOM ) {
374+ startRecognizeImageWithLight()
375+ })
351376
352377 rvData.add(Section (" Custom" ))
353378 rvData.add(Scan (" Online processing" , ACTION_TYPE_ONLINE ))
@@ -472,6 +497,12 @@ class MainActivity : FragmentActivity(), Serializable {
472497 Instance ().customization().edit().setCustomLabelStatus(status).apply ()
473498 Instance ().customization().edit().setCustomStatusPositionMultiplier(0.5f ).apply ()
474499 })
500+ rvData.add(Scan (" Custom Status & Images" ) {
501+ Instance ().customization().edit().setUiCustomizationLayer(getJsonFromAssets(" layer.json" )).apply ()
502+ })
503+ rvData.add(Scan (" Custom Status Animated" ) {
504+ initAnimation()
505+ })
475506 rvData.add(Section (" Custom animations" ))
476507 rvData.add(Scan (" Help animation image" ) {
477508 Instance ().customization().edit().setShowHelpAnimation(true ).apply ()
@@ -518,4 +549,72 @@ class MainActivity : FragmentActivity(), Serializable {
518549 var results: DocumentReaderResults ? = null
519550 const val ENCRYPTED_RESULT_SERVICE = " https://api.regulaforensics.com/api/process"
520551 }
552+
553+ private fun getJsonFromAssets (name : String ): JSONObject ? {
554+ val inputStream = this @MainActivity.assets.open(name)
555+ val jsonString = Scanner (inputStream).useDelimiter(" \\ A" ).next()
556+ try {
557+ return JSONObject (jsonString)
558+ } catch (e: JSONException ) {
559+ e.printStackTrace()
560+ }
561+ return null
562+ }
563+
564+ private fun cancelAnimation () {
565+ mTimerAnimator?.let {
566+ it.cancel()
567+ isAnimationStarted = false
568+ mTimerAnimator = null
569+ }
570+ Instance ().customization().edit().setUiCustomizationLayer(null ).apply ()
571+ }
572+
573+ private fun initAnimation () {
574+ isAnimationStarted = false ;
575+ val jsonObject: JSONObject ? = getJsonFromAssets(" layer_animation.json" )
576+ updatePosition(jsonObject, 0.5f )
577+ Instance ().customization().edit().setUiCustomizationLayer(jsonObject).apply ()
578+ mTimerAnimator = ValueAnimator .ofFloat(0.5f , 1.5f )
579+ mTimerAnimator?.let {
580+ it.duration = 2500
581+ it.interpolator = AccelerateInterpolator ()
582+ it.repeatMode = ValueAnimator .REVERSE
583+ it.repeatCount = 20
584+ it.addUpdateListener(AnimatorUpdateListener { animation ->
585+ updatePosition(jsonObject, animation.animatedValue as Float )
586+ Instance ().customization().edit().setUiCustomizationLayer(jsonObject)
587+ .applyImmediately(this @MainActivity)
588+ })
589+ }
590+ }
591+
592+ private fun updatePosition (jsonObject : JSONObject ? , position : Float ) {
593+ jsonObject?.let {
594+ val text = " Custom label that showing current time:" + SimpleDateFormat (" HH:mm:ss" )
595+ .format(Date ())
596+ (it.getJSONArray(" objects" )[0 ] as JSONObject ).getJSONObject(" label" )
597+ .getJSONObject(" position" ).put(" v" , position.toDouble())
598+ (it.getJSONArray(" objects" )[0 ] as JSONObject ).getJSONObject(" label" )
599+ .put(" text" , text)
600+ }
601+ }
602+
603+ private fun startRecognizeImageWithLight () {
604+ // For FULL_AUTH processing you need to do implementation in gradle com.regula.documentreader.core:fullauthrfid
605+ // Set databaseID to 'FullAuth' in method prepareDatabase
606+ // Instance().processParams().scenario = Scenario.SCENARIO_FULL_AUTH
607+ val image1 = BitmapFactory .decodeResource(resources, R .drawable.white)
608+ val image2 = BitmapFactory .decodeResource(resources, R .drawable.uv)
609+ val image3 = BitmapFactory .decodeResource(resources, R .drawable.ir)
610+ val imageData1 = ImageInputData (image1, eRPRM_Lights.RPRM_LIGHT_WHITE_FULL )
611+ val imageData2 = ImageInputData (image2, eRPRM_Lights.RPRM_LIGHT_UV )
612+ val imageData3 = ImageInputData (image3, eRPRM_Lights.RPRM_Light_IR_Full )
613+ recognizeSerialImages(imageData1, imageData2, imageData3)
614+ }
615+
616+ private fun recognizeSerialImages (vararg imageInputData : ImageInputData ) {
617+ loadingDialog = showDialog(" Processing images" )
618+ Instance ().recognizeImages(imageInputData, completion)
619+ }
521620}
0 commit comments