package Ġapp . if ny as . la . view Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View .* Ċ import Ġandroid . view binding . library . activity . view Binding Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġapp . if ny as . la . App . Companion . fu Ċ import Ġapp . if ny as . la . R Ċ import Ġapp . if ny as . la . databinding . Activity Main Binding Ċ import Ġapp . if ny as . la . util . Fun Utils Ċ import Ġco il . load Ċ import Ġco il . transform . Circle Crop Transformation Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . lifecycle . lifecycle Owner Ċ import Ġcom . das b ik ash . android _ network _ monitor . Network State Listener Ċ import Ġcom . das b ik ash . android _ network _ monitor . add Network State Listener Ċ import Ġcom . google . android . gms . near by . Near by Ċ import Ġcom . google . android . gms . near by . messages .* ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ// ĠActivity ĊĠĠĠ Ġprivate Ġval ĠTAG Ġby Ġlazy Ġ{ Ġjava Class . simple Name Ġ} ĊĠĠĠ Ġprivate Ġval Ġbind : ĠActivity Main Binding Ġby Ġview Binding () ĊĊĠĠĠ Ġ// ĠData ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlist : ĠMutable List < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhis : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġher : ĠString ĊĊĠĠĠ Ġ// ĠN ear by ĊĠĠĠ Ġprivate Ġval Ġmessage Ġby Ġlazy Ġ{ ĠMessage ( create Message Bytes ()) Ġ} ĊĠĠĠ Ġprivate Ġval Ġn Client Ġby Ġlazy Ġ{ ĠN ear by . get Messages Client ( this ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġsubscribe Options Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSubscribe Options . Builder (). set Strategy ( Strategy . BLE _ ONLY ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġprivate Ġval Ġpublish Options Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPublish Options . Builder (). set Strategy ( Strategy . BLE _ ONLY ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpending Intent Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( this , ĠBe acon Message Receiver :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġprivate Ġval Ġmessage Listener Ġ= Ġobject Ġ: ĠMessage Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Found ( msg : ĠMessage ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Found ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Count ( msg , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lost ( msg : ĠMessage ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Lost ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Count ( msg , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġlifecycle ĊĠĠĠ Ġ// ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( bind . root ) ĊĠĠĠĠĠĠĠ Ġinit Fun () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġstart Near by () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Near by () ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġfun ĊĠĠĠ Ġ// ĊĠĠĠ Ġprivate Ġfun Ġstart Near by () Ġ{ ĊĠĠĠĠĠĠĠ Ġn Client . publish ( message ) ĊĠĠĠĠĠĠĠ Ġn Client . subscribe ( message Listener , Ġsubscribe Options ) ĊĠĠĠĠĠĠĠ Ġreset Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Near by () Ġ{ ĊĠĠĠĠĠĠĠ Ġn Client . un publish ( message ) ĊĠĠĠĠĠĠĠ Ġn Client . unsubscribe ( message Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Fun () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ids () ĊĠĠĠĠĠĠĠ Ġinit Btn () ĊĠĠĠĠĠĠĠ Ġinit Img () ĊĠĠĠĠĠĠĠ Ġinit Net () ĊĠĠĠĠĠĠĠ Ġinit Debug () ĊĠĠĠĠĠĠĠ Ġ// Ġinit Worker () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġprivate Ġfun Ġinit Worker () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwork Request Ġ= ĠOne Time Work RequestBuilder < Scan Worker >(). build () ĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( application Context ). enqueue ( work Request ) ĊĠĠĠ Ġ} ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġinit Net () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Network State Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork State Listener . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġnav To Splash () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcreate No Net Dialog () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate No Net Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġ" No ĠConnection " ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Please Ġcheck Ġyour Ġinternet Ġconnection . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġalert Ġwill Ġbe Ġclosed Ġautomatically Ġafter Ġyou Ġare Ġconnected ." ĊĠĠĠĠĠĠĠ Ġval Ġbtn Ġ= Ġ" Close Ġ${ getString ( R . string . app _ name )}" ĊĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( text Ġ= Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( text Ġ= Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( text Ġ= Ġbtn ) Ġ{ Ġfinish After Transition () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Btn () Ġ{ ĊĠĠĠĠĠĠĠ Ġbind . img Heart . setOnClickListener Ġ{ Ġnav To Account () Ġ} ĊĠĠĠĠĠĠĠ Ġbind . img H is . setOnClickListener Ġ{ Ġcreate H is Toast () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate H is Toast () Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Your ĠId Ġis Ġ$ his ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ids () Ġ{ ĊĠĠĠĠĠĠĠ Ġhis Ġ= Ġintent . getString Extra (" his "). toString () ĊĠĠĠĠĠĠĠ Ġher Ġ= Ġintent . getString Extra (" her "). toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( his . isBlank () Ġ|| Ġher . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav To Account () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" init Ids : Ġ$ his , Ġ$ her ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Img () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimg Ġ= Ġintent . getString Extra (" img "). toString () ĊĠĠĠĠĠĠĠ Ġbind . img H is . load ( img ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcross fade ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformations ( Circle Crop Transformation ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġlist Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġbind . text Count . text Ġ= Ġ"${ list . distinct (). size }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Count ( msg : ĠMessage ?, Ġis Plus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġmsg ?. content ?. decode ToString ()?. split ("| ") ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġcontent ?. get ( 0 ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġcontent ?. get ( 1 ) Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġtext ĊĠĠĠĠĠĠĠ Ġif Ġ( target Ġ== Ġhis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Plus ) Ġdel Source ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list . contains ( source )) Ġplay Ring () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Heart View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdel Source ( source : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġlist . indexOf ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Heart View () ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġput Heart View () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġcount Ġtext ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġlist . distinct (). size ĊĠĠĠĠĠĠĠ Ġbind . text Count . text Ġ= Ġ"$ count " ĊĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġscanner Ġanim ĊĠĠĠĠĠĠĠ Ġbind . img Sc anning . visibility Ġ= Ġif Ġ( count Ġ> Ġ 0 ) ĠIN VISIBLE Ġelse ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġbind . img Sc anned . visibility Ġ= Ġif Ġ( count Ġ> Ġ 0 ) ĠVIS IBLE Ġelse ĠIN VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġheart Ġimg ĊĠĠĠĠĠĠĠ Ġval Ġdraw Ġ= Ġif Ġ( count Ġ> Ġ 0 ) ĠR . drawable . png _ full _ heart Ġelse ĠR . drawable . png _ empty _ heart ĊĠĠĠĠĠĠĠ Ġbind . img Heart . load ( draw ) Ġ{ Ġcross fade ( true ) Ġ} ĊĠĠĠĠĠĠĠ Ġfu . begin Transition ( bind . root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Ring () Ġ{ ĊĠĠĠĠĠĠĠ ĠMedia Player . create ( this , ĠR . raw . sound _ heart ). start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Message Bytes (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ her |$ his ". toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnav To Account () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinit Ġintent ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠAccount Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" last ", Ġher ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġstart Ġintent ĊĠĠĠĠĠĠĠ ĠFun Utils (). nav To Act ( this , Ġintent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnav To Splash () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSpl ash Activity :: class . java ) ĊĠĠĠĠĠĠĠ ĠFun Utils (). nav To Act ( this , Ġintent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Debug () Ġ{ ĊĠĠĠĠĠĠĠ Ġbind . text Count . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠMessage (" ir f any as ir as @ gmail . com | just ine j uno @ gmail . com ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . distinct (). isEmpty ()) Ġput Count ( msg , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġput Count ( msg , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* ĊĠĠĠ ĠTODO ĊĠĠĠ Ġadd Ġbg Ġmode Ċ */