/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠT ari ĠProject Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ċ Ġ* Ġwithout Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ċ Ġ* Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ 1 . ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ 2 . ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ Ġ* Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ 3 . ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ċ Ġ* Ġits Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ċ Ġ* Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND Ċ Ġ* ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , Ċ Ġ* ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES Ċ Ġ* ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR Ċ Ġ* ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ Ġ* ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT Ċ Ġ* ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; Ċ Ġ* ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) Ċ Ġ* ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE Ċ Ġ* ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS Ċ Ġ* ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . t ari . android . wallet . ui . fragment . send . add Re ce pi ent Ċ Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content .* Ċ import Ġandroid . os .* Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . InputType Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . animation . addListener Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . da as uu . ei . E ase Ċ import Ġcom . da as uu . ei . E asing Interpolator Ċ import Ġcom . t ari . android . wallet . R Ċ import Ġcom . t ari . android . wallet . R . color .* Ċ import Ġcom . t ari . android . wallet . R . dim en . add _ recipient _ clipboard _ emoji _ id _ container _ height Ċ import Ġcom . t ari . android . wallet . R . dim en . add _ recipient _ paste _ emoji _ id _ button _ visible _ top _ margin Ċ import Ġcom . t ari . android . wallet . R . string .* Ċ import Ġcom . t ari . android . wallet . application . Deep Link Ċ import Ġcom . t ari . android . wallet . application . Deep Link . Type . E MO JI _ ID Ċ import Ġcom . t ari . android . wallet . application . Deep Link . Type . PUBLIC _ KEY _ HEX Ċ import Ġcom . t ari . android . wallet . data . network . Network Repository Ċ import Ġcom . t ari . android . wallet . data . shared Prefs . Shared Prefs Repository Ċ import Ġcom . t ari . android . wallet . databinding . Fragment Add Recipient Binding Ċ import Ġcom . t ari . android . wallet . di . Di Container . app Component Ċ import Ġcom . t ari . android . wallet . extension . observe Ċ import Ġcom . t ari . android . wallet . infrastructure . Tracker Ċ import Ġcom . t ari . android . wallet . model .* Ċ import Ġcom . t ari . android . wallet . ui . common . Common Fragment Ċ import Ġcom . t ari . android . wallet . ui . common . re cyclerView . Common Adapter Ċ import Ġcom . t ari . android . wallet . ui . extension .* Ċ import Ġcom . t ari . android . wallet . ui . fragment . qr . EXTRA _ QR _ DATA Ċ import Ġcom . t ari . android . wallet . ui . fragment . qr . QR Scanner Activity Ċ import Ġcom . t ari . android . wallet . ui . fragment . send . add Re ce pi ent . list . Recipient ListAdapter Ċ import Ġcom . t ari . android . wallet . ui . fragment . send . add Re ce pi ent . list . Recipient ViewHolder Item Ċ import Ġcom . t ari . android . wallet . util .* Ċ import Ġcom . t ari . android . wallet . util . Constants . Wallet . emoji Formatter Chunk Size Ċ import Ġcom . t ari . android . wallet . util . Constants . Wallet . emoji Id Length Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġme . everything . android . ui . over scroll . Over Scroll Decorator Helper Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . math . min Ċ Ċ // todo Ġneeded Ġto Ġrefactor Ċ class ĠAdd Recipient Fragment Ġ: ĠCommon Fragment < Fragment Add Recipient Binding , ĠAdd Recipient ViewModel >(), ĊĠĠĠ ĠRecyclerView . On Item Touch Listener , ĊĠĠĠ ĠText Watcher Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġtracker : ĠTracker ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġshared Prefs Wrapper : ĠShared Prefs Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġclipboard Manager : ĠClip board Manager ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġnetwork Repository : ĠNetwork Repository ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList , Ġadapter Ġ& Ġlayout Ġmanager . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġre cyclerView Adapter : ĠRe cipient ListAdapter Ġ= ĠRe cipient ListAdapter () ĊĠĠĠ Ġprivate Ġvar Ġscroll Listener Ġ= ĠScroll Listener ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFields Ġrelated Ġto Ġemoji Ġid Ġinput Ġmask ing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġis Deleting Separator AtIndex : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtext Watcher Is Running Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġinput Normal Letter Spacing Ġ= Ġ 0 . 0 4 f ĊĠĠĠ Ġprivate Ġvar Ġinput Emoji Id Letter Spacing Ġ= Ġ 0 . 2 7 f ĊĊĠĠĠ Ġprivate Ġval Ġtext Changed Process Delay Ms Ġ= Ġ 1 0 0 L ĊĠĠĠ Ġprivate Ġval Ġtext Changed Process Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġprivate Ġvar Ġtext Changed Process Runnable Ġ= ĠRunnable Ġ{ Ġprocess TextChanged () Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġhide Paste Emoji Id Views On TextChanged Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠP aste - emoji - id - related Ġviews . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdim mer Views ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠarrayOf ( ui . top Dim mer View , Ġui . middle Dim mer View , Ġui . bottom Dim mer View ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ= ĠFragment Add Recipient Binding . inflate ( in flater , Ġcontainer , Ġfalse ). also Ġ{ Ġui Ġ= Ġit Ġ}. root ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġapp Component . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel : ĠAdd Recipient ViewModel Ġby Ġview Models () ĊĠĠĠĠĠĠĠ Ġbind ViewModel ( viewModel ) ĊĊĠĠĠĠĠĠĠ Ġsetup UI () ĊĠĠĠĠĠĠĠ Ġdisplay Initial List () ĊĠĠĠĠĠĠĠ Ġui . search EditText . set Raw InputType ( InputType . TYPE _ CLASS _ TEXT ) ĊĠĠĠĠĠĠĠ Ġui . search EditText . add TextChanged Listener ( this @ Add Recipient Fragment ) ĊĠĠĠĠĠĠĠ ĠviewModel . check Clipboard For Valid Emoji Id () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . screen ( path Ġ= Ġ"/ home / send _ t ari / add _ recipient ", Ġtitle Ġ= Ġ" Send ĠT ari Ġ- ĠAdd ĠRe cipient ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsubscribe View Modal () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe View Modal () Ġ= Ġwith ( viewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve ( list ) Ġ{ Ġre cyclerView Adapter . update ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserve ( navigation ) Ġ{ Ġprocess Navigation ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserve ( show Clipboard Data ) Ġ{ Ġshow Clipboard Data ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Clipboard Data ( data : ĠPublicKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui . root View . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views On TextChanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Paste Emoji Id Views ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus EditText And Show Keyboard () ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 L ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Navigation ( navigation : ĠAdd Recipient Navigation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġrequire Activity () Ġas ĠAdd Recipient Listener ĊĊĠĠĠĠĠĠĠ Ġwhen ( navigation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdd Recipient Navigation . To Amount Ġ-> Ġlistener . continue To Amount ( this , Ġnavigation . user ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . layout Manager Ġ= ĠLinearLayoutManager ( require Context ()) ĊĠĠĠĠĠĠĠ Ġre cyclerView Adapter . set ClickListener ( Common Adapter . ItemClickListener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠRe cipient ViewHolder Item )?. user ?. let Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity Ġas ? ĠAdd Recipient Listener )?. continue To Amount ( this , Ġuser ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . adapter Ġ= Ġre cyclerView Adapter ĊĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . add On Scroll Listener ( scroll Listener ) ĊĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . add On Item Touch Listener ( this ) ĊĠĠĠĠĠĠĠ Ġui . scroll Depth Gradient View . alpha Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġui . progress Bar . setColor ( color ( add _ recipient _ prog _ bar )) ĊĠĠĠĠĠĠĠ Ġui . progress Bar . visible () ĊĠĠĠĠĠĠĠ Ġui . continue Button . g one () ĊĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . g one () ĊĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views ( animate Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ ĠOver Scroll Decorator Helper . setUp Over Scroll ( ui . emoji Id ScrollView ) ĊĠĠĠĠĠĠĠ ĠOver Scroll Decorator Helper . setUp Over Scroll ( ui . search EditText ScrollView ) ĊĠĠĠĠĠĠĠ Ġui . search EditText . input Type Ġ= ĠInput Type . TYPE _ NULL ĊĠĠĠĠĠĠĠ Ġui . back Button . setOnClickListener Ġ{ Ġon Back Button Clicked ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġui . qr Code Button . setOnClickListener Ġ{ Ġon QR Button Click ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġui . continue Button . setOnClickListener Ġ{ Ġon Continue Button Clicked ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġdim mer Views . forEach Ġ{ Ġit . setOnClickListener Ġ{ Ġon Emoji Id Dim mer Clicked () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġui . paste Emoji Id Button . setOnClickListener Ġ{ Ġon Paste Emoji Id Button Clicked () Ġ} ĊĠĠĠĠĠĠĠ Ġui . emoji Id TextView . setOnClickListener Ġ{ Ġon Paste Emoji Id Button Clicked () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġstate Ġis Ġnot Ġinitial Ġif Ġthere 's Ġsome Ġcharacter Ġin Ġthe Ġsearch Ġinput ĊĠĠĠĠĠĠĠ Ġif Ġ( ui . search EditText . text . toString (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . setText ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . continue Button . g one () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart QR Code Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( activity , ĠQR Scanner Activity :: class . java ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠQR Scanner Activity . REQUEST _ QR _ SCAN NER ) ĊĠĠĠĠĠĠĠ Ġactivity ?. override Pending Transition ( R . anim . slide _ up , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDisplays Ġpaste - emoji - id - related Ġviews . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Paste Emoji Id Views ( publicKey : ĠPublicKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui . emoji Id TextView . text Ġ= ĠEmoji Util . getFull Emoji Id Sp ann able ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey . emoji Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring ( emoji _ id _ chunk _ separator ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( black ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( light _ gray ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġui . emoji Id Container View . set Bottom Margin (- dim en Px ( add _ recipient _ clipboard _ emoji _ id _ container _ height )) ĊĠĠĠĠĠĠĠ Ġui . emoji Id Container View . visible () ĊĠĠĠĠĠĠĠ Ġdim mer Views . forEach Ġ{ Ġdim mer View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdim mer View . alpha Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdim mer View . visible () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġanimate ĊĠĠĠĠĠĠĠ Ġval Ġemoji Id Ap pear Anim Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim Value Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdim mer Views . forEach Ġ{ Ġdim mer View Ġ-> Ġdim mer View . alpha Ġ= Ġanim Value Ġ* Ġ 0 . 6 f Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . emoji Id Container View . set Bottom Margin ((- dim en Px ( add _ recipient _ clipboard _ emoji _ id _ container _ height ) Ġ* Ġ( 1 f Ġ- Ġanim Value )). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠE asing Interpolator ( E ase . E ASE _ IN _ OUT _ EX PO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠConstants . UI . medium Duration Ms ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġanimate Ġand Ġshow Ġpaste Ġemoji Ġid Ġbutton ĊĠĠĠĠĠĠĠ Ġui . paste Emoji Id Container View . set Top Margin ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġpaste Button Ap pear Anim Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . paste Emoji Id Container View . set Top Margin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( dim en Px ( add _ recipient _ paste _ emoji _ id _ button _ visible _ top _ margin ) Ġ* Ġvalue ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . paste Emoji Id Container View . alpha Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Listener ( onStart Ġ= Ġ{ Ġui . paste Emoji Id Container View . visible () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠE asing Interpolator ( E ase . BACK _ OUT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠConstants . UI . short Duration Ms ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAn imator Set (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Se quent ially ( emoji Id Ap pear Anim , Ġpaste Button Ap pear Anim ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Delay Ġ= ĠConstants . UI . x Short Duration Ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH ides Ġpaste - emoji - id - related Ġviews . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhide Paste Emoji Id Views ( animate : ĠBoolean , Ġon End : Ġ(() Ġ-> Ġ( Unit )) ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! animate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . paste Emoji Id Container View . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . emoji Id Container View . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdim mer Views . forEach ( View :: g one ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End ?. let Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġanimate Ġand Ġhide Ġpaste Ġemoji Ġid Ġbutton ĊĠĠĠĠĠĠĠ Ġval Ġpaste Button Dis appear Anim Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġpaste Button Dis appear Anim . add Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . paste Emoji Id Container View . set Top Margin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( dim en Px ( add _ recipient _ paste _ emoji _ id _ button _ visible _ top _ margin ) Ġ* Ġ( 1 Ġ- Ġvalue )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . paste Emoji Id Container View . alpha Ġ= Ġ( 1 Ġ- Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpaste Button Dis appear Anim . addListener ( on End Ġ= Ġ{ Ġui . paste Emoji Id Container View . g one () Ġ}) ĊĠĠĠĠĠĠĠ Ġpaste Button Dis appear Anim . duration Ġ= ĠConstants . UI . short Duration Ms ĊĠĠĠĠĠĠĠ Ġ// Ġanimate Ġand Ġhide Ġemoji Ġid Ġ& Ġdim mers ĊĠĠĠĠĠĠĠ Ġval Ġemoji Id Dis appear Anim Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġemoji Id Dis appear Anim . add Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdim mer Views . forEach Ġ{ Ġdim mer View Ġ-> Ġdim mer View . alpha Ġ= Ġ 0 . 6 f Ġ* Ġ( 1 Ġ- Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . emoji Id Container View . set Bottom Margin ((- dim en Px ( add _ recipient _ clipboard _ emoji _ id _ container _ height ) Ġ* Ġvalue ). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġemoji Id Dis appear Anim . addListener ( on End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . emoji Id Container View . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdim mer Views . forEach ( View :: g one ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġemoji Id Dis appear Anim . duration Ġ= ĠConstants . UI . short Duration Ms ĊĊĠĠĠĠĠĠĠ Ġ// Ġchain Ġanim . s Ġand Ġstart ĊĠĠĠĠĠĠĠ Ġval Ġanim Set Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠ Ġanim Set . play Se quent ially ( paste Button Dis appear Anim , Ġemoji Id Dis appear Anim ) ĊĠĠĠĠĠĠĠ Ġif Ġ( on End Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Set . addListener ( on End Ġ= Ġ{ Ġon End () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim Set . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDisplays Ġnon - search - result Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdisplay Initial List () Ġ{ ĊĠĠĠĠĠĠĠ Ġui . progress Bar . g one () ĊĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . visible () ĊĠĠĠĠĠĠĠ ĠviewModel . display List () ĊĠĠĠĠĠĠĠ Ġfocus EditText And Show Keyboard () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfocus EditText And Show Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Activity Ġ= Ġactivity Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġui . search EditText . request Focus () ĊĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġm Activity . getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠ Ġimm . toggle Soft Input ( Input Method Manager . SHOW _ FOR CED , ĠInput Method Manager . HIDE _ IMP LICIT _ ONLY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Search TextChanged ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Initial List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . search And Display Recipients ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . progress Bar . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . visible () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Back Button Clicked ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . temp or arily Disable Click () ĊĠĠĠĠĠĠĠ Ġactivity ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . hide Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . root View . post Delayed ( 2 0 0 L ) Ġ{ Ġit . on Back Pressed () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear SearchResult () Ġ{ ĊĠĠĠĠĠĠĠ Ġui . progress Bar . g one () ĊĠĠĠĠĠĠĠ Ġui . contacts List RecyclerView . visible () ĊĠĠĠĠĠĠĠ ĠviewModel . display Search List ( listOf ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen ĠQR Ġcode Ġscanner Ġon Ġbutton Ġclick . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon QR Button Click ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . temp or arily Disable Click () ĊĠĠĠĠĠĠĠ Ġrequire Activity (). hide Keyboard () ĊĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views ( animate Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . root View . post Delayed ( Constants . UI . keyboard Hide Wait Ms ) Ġ{ Ġstart QR Code Activity () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠQR Scanner Activity . REQUEST _ QR _ SCAN NER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġdata Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqr Data Ġ= Ġdata . getString Extra ( EXTRA _ QR _ DATA ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeep Link Ġ= ĠDeep Link . from ( network Repository , Ġqr Data ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( deep Link . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE MO JI _ ID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . setText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link . identifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTextView . Buffer Type . EDIT ABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText ScrollView . smooth Scroll To ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠConstants . UI . medium Duration Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPUBLIC _ KEY _ HEX Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Hex Ġ= Ġdeep Link . identifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠviewModel . get PublicKey From HexString ( publicKey Hex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( publicKey Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . root View . post Ġ{ Ġui . search EditText . setText ( publicKey . emoji Id , ĠTextView . Buffer Type . EDIT ABLE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . post Delayed ({ Ġui . search EditText ScrollView . smooth Scroll To ( 0 , Ġ 0 ) Ġ}, ĠConstants . UI . medium Duration Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Continue Button Clicked ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . temp or arily Disable Click () ĊĠĠĠĠĠĠĠ ĠviewModel . on Continue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDim mer Ġclicked Ġ- Ġhide Ġpaste - related Ġviews . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Emoji Id Dim mer Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views ( animate Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). hide Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . clear Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠP aste Ġbanner Ġclicked . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Paste Emoji Id Button Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views On TextChanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views ( animate Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . scale X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . scale Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . setText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . emoji Id PublicKey !!. emoji Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTextView . Buffer Type . EDIT ABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . setSelection ( ui . search EditText . text ?. length Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . root View . post Delayed ({ Ġanimate Emoji Id Paste () Ġ}, ĠConstants . UI . x Short Duration Ms ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Emoji Id Paste () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġanimate Ġtext Ġsize ĊĠĠĠĠĠĠĠ Ġval Ġtext Anim Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġtext Anim . add Update Listener Ġ{ Ġvalue Animator : ĠValue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . scale X Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . scale Y Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsearch EditText . translation X Ġ= Ġ- width Ġ* Ġ( 1 f Ġ- Ġvalue ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtext Anim . duration Ġ= ĠConstants . UI . short Duration Ms ĊĠĠĠĠĠĠĠ Ġtext Anim . interpol ator Ġ= ĠE asing Interpolator ( E ase . BACK _ OUT ) ĊĠĠĠĠĠĠĠ Ġtext Anim . start () ĊĠĠĠĠĠĠĠ Ġui . root View . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText ScrollView . smooth Scroll To ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ}, ĠConstants . UI . short Duration Ms ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion Ġre cycler Ġview Ġitem Ġtouch Ġlistener ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHide Ġkeyboard Ġon Ġlist Ġtouch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Activity (). hide Keyboard () ĊĠĠĠĠĠĠĠ Ġui . search EditText . clear Focus () ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Dis allow Intercept Touch Event ( dis allow Intercept : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġemoji Ġid Ġinput Ġmask ing ĊĊĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Deleting Separator AtIndex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġ 1 Ġ&& Ġafter Ġ== Ġ 0 Ġ&& Ġs [ start ]. toString () Ġ== Ġstring ( emoji _ id _ chunk _ separator )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( hide Paste Emoji Id Views On TextChanged ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views ( animate Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Paste Emoji Id Views On TextChanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( text Watcher Is Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtext Changed Process Handler . remove Callbacks ( text Changed Process Runnable ) ĊĠĠĠĠĠĠĠ Ġtext Changed Process Handler . post Delayed ( text Changed Process Runnable , Ġtext Changed Process Delay Ms ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess TextChanged () Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Watcher Is Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġeditable Ġ= Ġui . search EditText . editable Text ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġeditable . toString () ĊĊĠĠĠĠĠĠĠ Ġui . continue Button . g one () ĊĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . g one () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( editable . toString (). first N Characters Are E moj is ( emoji Formatter Chunk Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġdeleting Ġa Ġseparator , Ġfirst Ġget Ġthe Ġindex Ġof Ġthe Ġcharacter Ġbefore Ġthat Ġseparator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġdelete Ġthat Ġcharacter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Deleting Separator AtIndex Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmoji Util . getStart IndexOf Item Ending AtIndex ( text , Ġis Deleting Separator AtIndex !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditable . delete ( index , Ġis Deleting Separator AtIndex !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Deleting Separator AtIndex Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġeditable . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete Ġall Ġsepar ators Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= Ġstring ( emoji _ id _ chunk _ separator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( offset , Ġindex ) Ġin ĠEmoji Util . get Existing Chunk Separator Indices ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġindex Ġ- Ġ( offset Ġ* Ġseparator . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditable . delete ( target , Ġtarget Ġ+ Ġseparator . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Without Separ ators Ġ= Ġeditable . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . text Alignment Ġ= ĠView . TEXT _ ALIGNMENT _ CENTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . letter Spacing Ġ= Ġinput Emoji Id Letter Spacing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġsepar ators ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( offset , Ġindex ) Ġin ĠEmoji Util . getNew Chunk Separator Indices ( text Without Separ ators ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Separator Sp ann able Ġ= ĠEmoji Util . get Chunk Separator Sp ann able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( light _ gray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġindex Ġ+ Ġ( offset Ġ* Ġseparator . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditable . insert ( target , Ġchunk Separator Sp ann able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġvalid Ġemoji Ġ- Ġdon 't Ġsearch Ġif Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber of E moj is Ġ= Ġtext Without Separ ators . numberOf E moj is () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Without Separ ators . contains Non Emoji () Ġ|| Ġnumber of E moj is Ġ> Ġemoji Id Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . emoji Id PublicKey Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . text Ġ= Ġstring ( add _ recipient _ invalid _ emoji _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . qr Code Button . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear SearchResult () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( number of E moj is Ġ== Ġemoji Id Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Without Separ ators Ġ== Ġshared Prefs Wrapper . emoji Id !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . emoji Id PublicKey Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . text Ġ= Ġstring ( add _ recipient _ own _ emoji _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . qr Code Button . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear SearchResult () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . qr Code Button . g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvalid Ġemoji Ġid Ġlength Ġ- Ġclear Ġlist , Ġno Ġsearch , Ġdisplay Ġcontinue Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . emoji Id PublicKey Ġ= ĠviewModel . get PublicKey From Emoji Id ( text Without Separ ators ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . emoji Id PublicKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring ( add _ recipient _ invalid _ emoji _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear SearchResult () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . invalid Emoji Id TextView . g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . continue Button . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. hide Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . clear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Search TextChanged ( text Without Separ ators ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . emoji Id PublicKey Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui . qr Code Button . visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Search TextChanged ( text Without Separ ators ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . emoji Id PublicKey Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . qr Code Button . visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . text Alignment Ġ= ĠView . TEXT _ ALIGNMENT _ TEXT _ START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui . search EditText . letter Spacing Ġ= Ġinput Normal Letter Spacing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Search TextChanged ( editable . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtext Watcher Is Running Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġscroll Ġdepth Ġgradient Ġview Ġcontrols ĊĊĠĠĠ Ġprivate Ġfun Ġon RecyclerView Sc rolled ( total Delta Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui . scroll Depth Gradient View . alpha Ġ= Ġmin ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . UI . scroll Depth Shadow View Max Opacity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Delta Y Ġ/ Ġ( dim en Px ( R . dim en . add _ recipient _ contact _ list _ item _ height )). toFloat () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠScroll Listener ( fragment : ĠAdd Recipient Fragment ) Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfragment WR Ġ= ĠWeak Reference ( fragment ) ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtotal Delta Y Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Delta Y Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġd X : ĠInt , Ġd Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġd X , Ġd Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Delta Y Ġ+= Ġd Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment WR . get ()?. on RecyclerView Sc rolled ( total Delta Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend Ġregion Ċ Ċ }