package Ġcom . six b yn ine . dial er for warder . contacts Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . github . tam ir 7 . contacts . Contact Ċ import Ġcom . github . tam ir 7 . contacts . Contacts Ċ import Ġcom . github . tam ir 7 . contacts . Query Ċ import Ġcom . six b yn ine . dial er for warder . Permission Checker Ċ import Ġcom . six b yn ine . dial er for warder . inject . Activity Scoped Ċ import Ġcom . six b yn ine . dial er for warder . sanitize And Parse Ċ import Ġio . m ichael ro cks . lib phon enumber . android . PhoneNumber Util Ċ import Ġio . m ichael ro cks . lib phon enumber . android . Ph on enumber . PhoneNumber Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjavax . inject . Inject Ċ Ċ @ Activity Scoped Ċ class ĠContact Cache Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval ĠphoneNumber Util : ĠPhone Number Util , ĊĠĠĠ Ġprivate Ġval Ġpermission Checker : ĠPermission Checker , ĊĠĠĠ Ġexecutor : ĠExecutor Ċ ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġmap Ġon Ġthe Ġbackground Ġwhen Ġwe 're Ġcreated ĊĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Contact With PhoneNumber (" 3 4 7 5 5 5 5 5 5 5 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcall Cache : ĠMutable Map < Contact Query Wrapper , ĠList < Contact >> Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval ĠphoneNumber Map : ĠLazy < Mutable Map < PhoneNumber , ĠContact >> Ġ= Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < PhoneNumber , ĠContact >() ĊĠĠĠĠĠĠĠ Ġget ( GetAll Query ()). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . phone Numbers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ phoneNumber Util . sanitize And Parse ( it . number )] Ġ= Ġcontact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġlisten Ġfor Ġcontact Ġchanges ĊĊĠĠĠ Ġinterface ĠContact Query Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery : ĠQuery ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠGetAll Query Ġ: ĠContact Query Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġquery : ĠQuery Ġ= ĠContact s . getQuery (). has PhoneNumber () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠGetAll Query ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Contact sWith Phone Numbers (): ĠList < Contact > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget ( GetAll Query ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( query : ĠContact Query Wrapper ): ĠList < Contact > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! permission Checker . should Use Contacts ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArrayList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Cache . get Or Put ( query , Ġ{ Ġquery . query . find () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Contact With PhoneNumber ( phoneNumber : ĠString ): ĠContact ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Contact With PhoneNumber ( phoneNumber Util . sanitize And Parse ( phoneNumber )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Contact With PhoneNumber ( phoneNumber : ĠPhone Number ): ĠContact ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠphoneNumber Map . value [ phoneNumber ] ĊĠĠĠ Ġ} Ċ }