package Ġcom . code po ka . sms _ retrie ver _ api Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . util . Log Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar Ċ import Ġcom . google . android . gms . auth . api . phone . Sms Retriever ; Ċ import Ġcom . google . android . gms . common . api . Common StatusCode s ; Ċ import Ġcom . google . android . gms . common . api . Status ; Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern ĊĊ Ċ class ĠS ms Retriever Api Plugin ( private Ġval Ġcontext : ĠActivity ) Ġ: ĠMethod Call Handler Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġreceiver : ĠMy SMS Broadcast Receiver ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsms : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġresult : ĠMethod Channel . Result ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġregister With ( regist rar : ĠRegist rar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMethod Channel ( regist rar . messenger (), Ġ" com . code po ka . sms _ retrie ver _ api ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( Sms Retriever Api Plugin ( regist rar . activity ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MethodCall ( call : ĠMethod Call , Ġresult : ĠMethod Channel . Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . method Ġ== Ġ" getApp Signature " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠApp Signature Helper ( this . context ). getApp Signatures ()[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( signature ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . method Ġ== Ġ" start Listening " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= ĠMy SMS Broadcast Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . context . register Receiver ( receiver , ĠIntent Filter ( Sms Retriever . SMS _ RE TR IE VED _ ACTION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Listening () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . method Ġ== Ġ" stop Listening " Ġ-> Ġunregister () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult . not Implemented () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġstart Listening () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġan Ġinstance Ġof ĠS ms Retriever Client , Ġused Ġto Ġstart Ġlistening Ġfor Ġa Ġmatching ĊĠĠĠĠĠĠĠ Ġ// ĠSMS Ġmessage . ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠS ms Retriever . getClient ( this . context Ġ/* Ġcontext Ġ*/) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStarts ĠS ms Retriever , Ġwhich Ġwaits Ġfor ĠONE Ġmatching ĠSMS Ġmessage Ġuntil Ġtimeout ĊĠĠĠĠĠĠĠ Ġ// Ġ( 5 Ġminutes ). ĠThe Ġmatching ĠSMS Ġmessage Ġwill Ġbe Ġsent Ġvia Ġa ĠBroadcast ĠIntent Ġwith ĊĠĠĠĠĠĠĠ Ġ// Ġaction ĠS ms Retriever # SMS _ RE TR IE VED _ ACTION . ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġclient . start Sms Retriever () ĊĊĠĠĠĠĠĠĠ Ġ// ĠListen Ġfor Ġsuccess / failure Ġof Ġthe Ġstart ĠTask . ĠIf Ġin Ġa Ġbackground Ġthread , Ġthis ĊĠĠĠĠĠĠĠ Ġ// Ġcan Ġbe Ġmade Ġblocking Ġusing ĠTasks . await ( task , Ġ[ timeout ]); ĊĠĠĠĠĠĠĠ Ġtask . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSuccessfully Ġstarted Ġretrie ver , Ġexpect Ġbroadcast Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( java Class :: getSimpleName . name , Ġ" task Ġstarted ") ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFailed Ġto Ġstart Ġretrie ver , Ġinspect ĠException Ġfor Ġmore Ġdetails ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( java Class :: getSimpleName . name , Ġ" task Ġstarting Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . context . unregister Receiver ( receiver ); ĊĠĠĠ Ġ}; ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBroadcast Receiver Ġto Ġwait Ġfor ĠSMS Ġmessages . ĠThis Ġcan Ġbe Ġregistered Ġeither ĊĠĠĠĠ Ġ* Ġin Ġthe ĠAndroid Manifest Ġor Ġat Ġruntime . Ġ ĠShould Ġfilter ĠInt ents Ġon ĊĠĠĠĠ Ġ* ĠS ms Retriever . SMS _ RE TR IE VED _ ACTION . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠMy SMS Broadcast Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Sms Retriever . SMS _ RE TR IE VED _ ACTION Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġintent . extras ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġextras !!. get ( Sms Retriever . EXTRA _ STATUS ) Ġas ĠStatus ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status . statusCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon StatusCode s . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet ĠSMS Ġmessage Ġcontents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġextras . get ( Sms Retriever . EXTRA _ SMS _ MESSAGE ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern : ĠPattern Ġ= ĠPattern . compile ("\\ d { 4 , 6 }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher : ĠMatcher Ġ= Ġpattern . matcher ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. success ( matcher . group ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. success ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon StatusCode s . TIMEOUT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtract Ġone - time Ġcode Ġfrom Ġthe Ġmessage Ġand Ġcomplete Ġverification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġsending Ġthe Ġcode Ġback Ġto Ġyour Ġserver . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWaiting Ġfor ĠSMS Ġtimed Ġout Ġ( 5 Ġminutes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġthe Ġerror Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ