package Ġcontacts . core . sim Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġcontacts . core .* Ċ import Ġcontacts . core . entities . Sim Contact Ċ import Ġcontacts . core . entities . mapper . sim Contact Mapper Ċ import Ġcontacts . core . entities . table . Table Ċ import Ġcontacts . core . util . query Ċ Ċ /** Ċ Ġ* ĠQueries Ġon Ġthe ĠSIM Ġcard Ġtable . Ċ Ġ* Ċ Ġ* Ġ## ĠPermissions Ċ Ġ* Ċ Ġ* ĠThe Ġ[ Contacts Permissions . READ _ PERMISSION ] Ġis Ġassumed Ġto Ġhave Ġbeen Ġgranted Ġalready Ġin Ġthese Ċ Ġ* Ġexamples Ġfor Ġb rev ity . ĠIf Ġnot Ġgranted , Ġthe Ġquery Ġwill Ġdo Ġnothing Ġand Ġreturn Ġan Ġempty Ġlist . Ċ Ġ* Ċ Ġ* Ġ## ĠUsage Ċ Ġ* Ċ Ġ* ĠHere Ġis Ġan Ġexample Ġquery Ġthat Ġreturns Ġall Ġof Ġthe Ġcontacts Ġin Ġthe ĠSIM Ġcard . Ċ Ġ* Ċ Ġ* ĠIn ĠKotlin / Java , Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġsim Contacts Ġ= Ġquery . find () Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ## ĠLimit ations Ċ Ġ* Ċ Ġ* ĠProjection Ġ( include ), Ġselection Ġ( where ), Ġorder , Ġlimit , Ġand Ġoffset Ġare Ġnot Ġsupported Ġby Ġthe Ċ Ġ* ĠSIM ĠContact s Ġtable . ĠTherefore , Ġyou Ġare Ġonly Ġable Ġto Ġget Ġall ĠSIM Ġcontacts Ġwhen Ġquerying . Ċ Ġ* Ċ Ġ* ĠDep ending Ġon Ġmemory Ġsize , ĠSIM Ġcards Ġcan Ġhold Ġ 2 0 0 Ġto Ġ 5 0 0 + Ġcontacts . ĠThe Ġmost Ġcommon Ġbeing Ġaround Ċ Ġ* Ġ 2 5 0 . ĠMost , Ġif Ġnot Ġall , ĠSIM Ġcards Ġhave Ġless Ġthan Ġ 1 mb Ġmemory Ġ( aver aging Ġ 3 2 KB Ġto Ġ 6 4 KB ). ĠTherefore , Ċ Ġ* Ġmemory Ġand Ġspeed Ġshould Ġnot Ġbe Ġaffected Ġmuch Ġby Ġnot Ġbeing Ġable Ġto Ġsort / order Ġand Ġpag inate . Ċ Ġ* Ċ Ġ* ĠYou Ġmay Ġperform Ġyour Ġown Ġsorting Ġand Ġpagination Ġif Ġyou Ġwish . Ċ Ġ*/ Ċ interface ĠSim Contacts Query Ġ: ĠCr ud Api Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Result ] Ġmatching Ġthe Ġpreceding Ġquery Ġoptions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPriv ileges ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠRequires Ġ[ Contacts Permissions . READ _ PERMISSION ]. ĠReturns Ġan Ġempty Ġresult Ġotherwise . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠThread ĠS afety ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġcalled Ġin Ġa Ġbackground Ġthread Ġto Ġavoid Ġblocking Ġthe ĠUI Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ[ ANDROID ĠX ] Ġ@ Worker Thread Ġ( not Ġusing Ġannotation Ġto Ġavoid Ġdependency Ġon Ġandroidx . annotation ) ĊĠĠĠ Ġfun Ġfind (): ĠResult ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Result ] Ġmatching Ġthe Ġpreceding Ġquery Ġoptions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPermissions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠRequires Ġ[ Contacts Permissions . READ _ PERMISSION ]. ĠReturns Ġan Ġempty Ġresult Ġotherwise . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠC ancellation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof ĠSIM Ġcontact Ġdata Ġfound Ġmay Ġtake Ġmore Ġthan Ġa Ġfew Ġmilliseconds Ġto Ġprocess . ĊĠĠĠĠ Ġ* ĠTherefore , Ġcancellation Ġis Ġsupported Ġwhile Ġthe ĠSIM Ġcontact Ġlist Ġis Ġbeing Ġbuilt . ĊĠĠĠĠ Ġ* ĠTo Ġcancel Ġat Ġany Ġtime , Ġthe Ġ[ cancel ] Ġfunction Ġshould Ġreturn Ġtrue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġuseful Ġwhen Ġrunning Ġthis Ġfunction Ġin Ġa Ġbackground Ġthread Ġor Ġcoroutine . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠThread ĠS afety ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġcalled Ġin Ġa Ġbackground Ġthread Ġto Ġavoid Ġblocking Ġthe ĠUI Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ[ ANDROID ĠX ] Ġ@ Worker Thread Ġ( not Ġusing Ġannotation Ġto Ġavoid Ġdependency Ġon Ġandroidx . annotation ) ĊĠĠĠ Ġ// Ġ@ Jvm Over loads Ġcannot Ġbe Ġused Ġin Ġinterface Ġmethods ... ĊĠĠĠ Ġ// Ġfun Ġfind ( cancel : Ġ() Ġ-> ĠBoolean Ġ= Ġ{ Ġfalse Ġ}): ĠResult ĊĠĠĠ Ġfun Ġfind ( cancel : Ġ() Ġ-> ĠBoolean ): ĠResult ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġred acted Ġinstance Ġwhere Ġall Ġprivate Ġuser Ġdata Ġare Ġred acted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠRed acted Ġinstances Ġmay Ġproduce Ġinvalid Ġresults ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠRed acted Ġinstance Ġmay Ġhave Ġcritical Ġinformation Ġred acted , Ġwhich Ġis Ġrequired Ġto Ġmake ĊĠĠĠĠ Ġ* Ġthe Ġoperation Ġwork Ġproperly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Red acted Ġoperations Ġshould Ġtypically Ġonly Ġbe Ġused Ġfor Ġlogging Ġin Ġproduction ! ** ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠWe Ġhave Ġto Ġcast Ġthe Ġreturn Ġtype Ġbecause Ġwe Ġare Ġnot Ġusing Ġrecursive Ġgeneric Ġtypes . ĊĠĠĠ Ġoverride Ġfun Ġred acted Copy (): ĠSim Contacts Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġlist Ġof Ġ[ Sim Contact ] s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠThe Ġ[ toString ] Ġfunction ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ[ toString ] Ġfunction Ġof Ġinstances Ġof Ġthis Ġwill Ġnot Ġreturn Ġthe Ġstring Ġrepresentation Ġof ĊĠĠĠĠ Ġ* Ġevery ĠSIM Ġcontact Ġin Ġthe Ġlist . ĠIt Ġwill Ġinstead Ġreturn Ġa Ġsummary Ġof Ġthe ĠSIM Ġcontacts Ġin ĊĠĠĠĠ Ġ* Ġthe Ġlist Ġand Ġperhaps Ġthe Ġfirst Ġ[ Sim Contact ] Ġonly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġdone Ġdue Ġto Ġthe Ġpotentially Ġlarge Ġquant ities Ġof ĠSIM Ġcontacts , Ġwhich Ġcould Ġblock ĊĠĠĠĠ Ġ* Ġthe ĠUI Ġif Ġnot Ġlogging Ġin Ġbackground Ġthreads . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġmay Ġprint Ġindividual ĠSIM Ġcontacts Ġin Ġthis Ġlist Ġby Ġiter ating Ġthrough Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠResult Ġ: ĠList < Sim Contact >, ĠCr ud Api . Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġto Ġcast Ġthe Ġreturn Ġtype Ġbecause Ġwe Ġare Ġnot Ġusing Ġrecursive Ġgeneric Ġtypes . ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġred acted Copy (): ĠResult ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" FunctionName ") Ċ internal Ġfun ĠSim Contacts Query ( contacts : ĠContact s ): ĠSim Contacts Query Ġ= ĠSim Contacts Query Impl ( contacts ) Ċ Ċ private Ġclass ĠSim Contacts Query Impl ( ĊĠĠĠ Ġoverride Ġval Ġcontacts Api : ĠContact s , ĊĠĠĠ Ġoverride Ġval Ġis Red acted : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠSim Contacts Query Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSim Contacts Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Permission : Ġ${ permissions . can Query ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Red acted : Ġ$ is Red acted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġoverride Ġfun Ġred acted Copy (): ĠSim Contacts Query Ġ= ĠSim Contacts Query Impl ( ĊĠĠĠĠĠĠĠ Ġcontacts Api , ĊĠĠĠĠĠĠĠ Ġis Red acted Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind (): ĠSim Contacts Query . Result Ġ= Ġfind Ġ{ Ġfalse Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind ( cancel : Ġ() Ġ-> ĠBoolean ): ĠSim Contacts Query . Result Ġ{ ĊĠĠĠĠĠĠĠ Ġon Pre Execute () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! permissions . can Query ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSim Contacts QueryResult ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . resolve ( cancel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. red acted Copy Or This ( is Red acted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġon Post Execute ( contacts Api ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠContent Resolver . resolve ( cancel : Ġ() Ġ-> ĠBoolean ): ĠSim Contacts Query . Result Ġ= Ġquery ( ĊĠĠĠ ĠTable . Sim Contacts , ĊĠĠĠ Ġ// ĠThe Ġactual Ġdatabase Ġquery Ġselection Ġis Ġnot Ġsupported . ĠHowever , Ġwe Ġstill Ġneed Ġto Ġinclude Ġall ĊĠĠĠ Ġ// Ġfields Ġso Ġthat Ġour Ġcustom Ġcurs ors Ġwill Ġnot Ġreturn Ġnull . ĊĠĠĠ ĠInclude ( Sim Contacts Fields ), ĊĠĠĠ Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġval Ġsim Contacts List Ġ= Ġmutable ListOf < Sim Contact >() ĊĠĠĠ Ġval Ġsim Contact Mapper Ġ= Ġit . sim Contact Mapper () ĊĊĠĠĠ Ġwhile Ġ(! cancel () Ġ&& Ġit . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġsim Contacts List . add ( sim Contact Mapper . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠEnsure Ġincomplete Ġdata Ġsets Ġare Ġnot Ġreturned . ĊĠĠĠ Ġif Ġ( cancel ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġsim Contacts List . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSim Contacts QueryResult ( sim Contacts List ) Ċ Ċ } Ġ?: ĠSim Contacts QueryResult ( emptyList ()) Ċ Ċ private Ġclass ĠSim Contacts QueryResult Ġprivate Ġconstructor ( ĊĠĠĠ Ġsim Contacts : ĠList < Sim Contact >, ĊĠĠĠ Ġoverride Ġval Ġis Red acted : ĠBoolean Ċ ) Ġ: ĠArrayList < Sim Contact >( sim Contacts ), ĠSim Contacts Query . Result Ġ{ ĊĊĠĠĠ Ġconstructor ( sim Contacts : ĠList < Sim Contact >) Ġ: Ġthis ( sim Contacts , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSim Contacts Query . Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNumber Ġof ĠSIM Ġcontacts Ġfound : Ġ$ size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirst ĠSIM Ġcontact : Ġ${ first OrNull ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Red acted : Ġ$ is Red acted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġoverride Ġfun Ġred acted Copy (): ĠSim Contacts Query . Result Ġ= ĠSim Contacts QueryResult ( ĊĠĠĠĠĠĠĠ Ġred acted Cop ies (), ĊĠĠĠĠĠĠĠ Ġis Red acted Ġ= Ġtrue ĊĠĠĠ Ġ) Ċ }