/* Ċ Ġ* ĠCopyright Ġ( C ) ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġexample . j ll arr az . com . passport reader . ml kit Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . util . Log Ċ Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . ml . vision . Firebase Vision Ċ import Ġcom . google . firebase . ml . vision . common . Firebase Vision Image Ċ import Ġcom . google . firebase . ml . vision . text . Firebase Vision Text Ċ import Ġcom . google . firebase . ml . vision . text . Firebase Vision Text Recognizer Ċ Ċ import Ġnet . sf . sc uba . data . Gender ĊĊ Ċ import Ġorg . j mr td . lds . icao . MR Z Info Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . util . regex . Pattern ĊĊ Ċ /** Ċ Ġ* ĠA Ġvery Ġsimple ĠProcessor Ġwhich Ġreceives Ġdetected ĠText Blocks Ġand Ġadds Ġthem Ġto Ġthe Ġoverlay Ċ Ġ* Ġas ĠO cr Graphics . Ċ Ġ*/ Ċ class ĠO cr M rz Detector Processor ( val Ġcallback : ĠMR Z Callback ) Ġ: ĠVision Processor Base < Firebase Vision Text >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdetector : ĠFirebase Vision Text Recognizer ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdetector Ġ= ĠFirebase Vision . getInstance (). on Device Text Recognizer ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Exception Ġthrown Ġwhile Ġtrying Ġto Ġclose ĠText ĠDetector : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdetect In Image ( image : ĠFirebase Vision Image ): ĠTask < Firebase Vision Text > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdetector . process Image ( image ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonSuccess ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults : ĠFirebase Vision Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Metadata : ĠFrame Metadata ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Required : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap : ĠBitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġfull Read Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= Ġresults . text Blocks ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġblocks . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġblocks [ i ]. lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġlines . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// extract Ġscanned Ġtext Ġlines Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp += lines . get ( j ). getText (). trim ()+" - "; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ+= Ġlines [ j ]. text Ġ+ Ġ"-" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġtemp . replace ("\ r ". to Regex (), Ġ""). replace ("\ n ". to Regex (), Ġ""). replace ("\ t ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Read Ġ+= Ġ"$ temp -" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Read : Ġ$ full Read ") ĊĠĠĠĠĠĠĠ Ġval Ġpattern Line Old Passport Type Ġ= ĠPattern . compile ( REGEX _ OLD _ PAS SP ORT ) ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Line Old Passport Type Ġ= Ġpattern Line Old Passport Type . matcher ( full Read ) ĊĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( matcher Line Old Passport Type . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Old Ġpassport Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline 2 Ġ= Ġmatcher Line Old Passport Type . group ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdocument Number Ġ= Ġline 2 . substring ( 0 , Ġ 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate OfBirth Day Ġ= Ġline 2 . substring ( 1 3 , Ġ 1 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpiration Date Ġ= Ġline 2 . substring ( 2 1 , Ġ 2 7 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// As ĠO Ġand Ġ 0 Ġand Ġreally Ġsimilar Ġmost Ġof Ġthe Ġcountries Ġjust Ġremoved Ġthem Ġfrom Ġthe Ġpassport , Ġso Ġfor Ġaccuracy ĠI Ġam Ġformatting Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Number Ġ= Ġdocument Number . replace (" O ". to Regex (), Ġ" 0 ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmr z Info Ġ= Ġcreate Dummy M rz ( document Number , Ġdate OfBirth Day , Ġexpiration Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on MR Z Read ( mr z Info , Ġtime Required ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Try Ġwith Ġthe Ġnew ĠIP Ġpassport Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Line IP ass port Type Line 1 Ġ= ĠPattern . compile ( REGEX _ IP _ PAS SP ORT _ LINE _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Line IP ass port Type Line 1 Ġ= Ġpattern Line IP ass port Type Line 1 . matcher ( full Read ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Line IP ass port Type Line 2 Ġ= ĠPattern . compile ( REGEX _ IP _ PAS SP ORT _ LINE _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Line IP ass port Type Line 2 Ġ= Ġpattern Line IP ass port Type Line 2 . matcher ( full Read ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher Line IP ass port Type Line 1 . find () Ġ&& Ġmatcher Line IP ass port Type Line 2 . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline 1 Ġ= Ġmatcher Line IP ass port Type Line 1 . group ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline 2 Ġ= Ġmatcher Line IP ass port Type Line 2 . group ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdocument Number Ġ= Ġline 1 . substring ( 5 , Ġ 1 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate OfBirth Day Ġ= Ġline 2 . substring ( 0 , Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpiration Date Ġ= Ġline 2 . substring ( 8 , Ġ 1 4 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// As ĠO Ġand Ġ 0 Ġand Ġreally Ġsimilar Ġmost Ġof Ġthe Ġcountries Ġjust Ġremoved Ġthem Ġfrom Ġthe Ġpassport , Ġso Ġfor Ġaccuracy ĠI Ġam Ġformatting Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Number Ġ= Ġdocument Number . replace (" O ". to Regex (), Ġ" 0 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmr z Info Ġ= Ġcreate Dummy M rz ( document Number , Ġdate OfBirth Day , Ġexpiration Date ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on MR Z Read ( mr z Info , Ġtime Required ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// No Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on MR Z Read Failure ( time Required ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġfun Ġcreate Dummy M rz ( document Number : ĠString , Ġdate OfBirth Day : ĠString , Ġexpiration Date : ĠString ): ĠMR Z Info Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMR Z Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ESP ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" D UMMY ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" D UMMY ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ESP ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate OfBirth Day , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGender . M ALE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Failure ( e : ĠException , Ġtime Required : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Text Ġdetection Ġfailed .$ e ") ĊĠĠĠĠĠĠĠ Ġcallback . on Failure ( e , Ġtime Required ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠMR Z Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon MR Z Read ( mr z Info : ĠMR Z Info , Ġtime Required : ĠLong ) ĊĠĠĠĠĠĠĠ Ġfun Ġon MR Z Read Failure ( time Required : ĠLong ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Failure ( e : ĠException , Ġtime Required : ĠLong ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠO cr M rz Detector Processor :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREG EX _ OLD _ PAS SP ORT Ġ= Ġ"[ A - Z 0 - 9 < ]{ 9 }[ 0 - 9 ]{ 1 }[ A - Z < ]{ 3 }[ 0 - 9 ]{ 6 }[ 0 - 9 ]{ 1 }[ FM < ]{ 1 }[ 0 - 9 ]{ 6 }[ 0 - 9 ]{ 1 }" ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREG EX _ IP _ PAS SP ORT _ LINE _ 1 Ġ= Ġ"\\ b IP [ A - Z < ]{ 3 }[ A - Z 0 - 9 < ]{ 9 }[ 0 - 9 ]{ 1 }" ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREG EX _ IP _ PAS SP ORT _ LINE _ 2 Ġ= Ġ"[ 0 - 9 ]{ 6 }[ 0 - 9 ]{ 1 }[ FM < ]{ 1 }[ 0 - 9 ]{ 6 }[ 0 - 9 ]{ 1 }[ A - Z < ]{ 3 }" ĊĠĠĠ Ġ} Ċ } Ċ