package Ġcontacts . core Ċ Ċ import Ġandroid . accounts . Account Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Contacts Contract Ċ import Ġcontacts . core . entities . Contact Ċ import Ġcontacts . core . entities . Group Ċ import Ġcontacts . core . entities . cursor . contacts Cursor Ċ import Ġcontacts . core . entities . custom . Custom Data Registry Ċ import Ġcontacts . core . util . isEmpty Ċ import Ġcontacts . core . util . query Ċ import Ġcontacts . core . util . to Raw Contacts Where Ċ import Ġcontacts . core . util . unsafe Lazy Ċ Ċ /** Ċ Ġ* ĠA Ġgeneral ized Ġversion Ġof Ġ[ Query ], Ġthat Ġlets Ġthe ĠContact s ĠProvider Ġperform Ġthe Ġsearch Ġusing Ġits Ċ Ġ* Ġown Ġcustom Ġmatching Ġalgorithm . ĠIt Ġallows Ġyou Ġto Ġget Ġthe Ġexact Ġsame Ġsearch Ġresults Ġas Ġthe Ġnative Ċ Ġ* ĠContact s Ġapp ! Ċ Ġ* Ċ Ġ* ĠThis Ġtype Ġof Ġquery Ġis Ġthe Ġbasis Ġof Ġan Ġapp Ġthat Ġdoes Ġa Ġbroad Ġsearch Ġof Ġthe ĠContact s ĠProvider . ĠThe Ċ Ġ* Ġtechnique Ġis Ġuseful Ġfor Ġapps Ġthat Ġwant Ġto Ġimplement Ġfunctionality Ġsimilar Ġto Ġthe ĠPeople Ġapp 's Ċ Ġ* Ġcontact Ġlist Ġscreen . Ċ Ġ* Ċ Ġ* ĠCustom Ġmime types Ġ/ Ġdata Ġare Ġexcluded Ġfrom Ġthe Ġsearch ! ĠUse Ġ[ Query ] Ġto Ġsearch Ġfor Ġcontacts Ġusing Ċ Ġ* Ġcustom Ġdata . Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġneed Ġmore Ġgranularity Ġand Ġcustom izations Ġwhen Ġproviding Ġmatching Ġcriteria , Ġuse Ġ[ Query ]. Ċ Ġ* ĠFor Ġexample , Ġgetting Ġa ĠContact Ġby ĠID Ġis Ġnot Ġsupported Ġby Ġ[ Broad Query ] Ġbut Ġcan Ġbe Ġachieved Ġby Ċ Ġ* Ġ[ Query ]. Ċ Ġ* Ċ Ġ* Ġ## Ġ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 Ġthe Ġfirst Ġ 1 0 Ġ[ Contact ] s , Ġskipping Ġthe Ġfirst Ġ 5 , Ġwhere Ġthe Ċ Ġ* Ġany ĠContact Ġdata Ġ( e . g . Ġname , Ġemail , Ġaddress , Ġphone , Ġetc ) Ġmatches Ġthe Ġsearch Ġterm Ġ" john ", Ġordered Ċ Ġ* Ġby Ġthe ĠContact Ġdisplay Ġname Ġprimary Ġ( given Ġname Ġfirst ) Ġin Ġascending Ġorder Ġ( ign oring Ġcase ). Ġ ĠOnly Ċ Ġ* ĠContact s Ġwith Ġat Ġleast Ġone ĠRaw Contact Ġbelong ing Ġto Ġthe Ġgiven Ġaccount Ġand Ġgroups Ġare Ġincluded . Ċ Ġ* ĠOnly Ġthe Ġfull Ġname Ġand Ġemail Ġaddress Ġattributes Ġof Ġthe Ġ[ Contact ] Ġobjects Ġare Ġincluded . Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġimport Ġcontacts . core . Fields . Name Ċ Ġ* Ġimport Ġcontacts . core . Fields . Address Ċ Ġ* Ġimport Ġcontacts . core . Contacts Fields . DisplayName Primary Ċ Ġ* Ċ Ġ* Ġval Ġcontacts Ġ: ĠList < Contact > Ġ= Ġbroad Query . Ċ Ġ* ĠĠĠĠĠ Ġ. accounts ( account ) Ċ Ġ* ĠĠĠĠĠ Ġ. groups ( groups ) Ċ Ġ* ĠĠĠĠĠ Ġ. include ( Name , ĠAddress ) Ċ Ġ* ĠĠĠĠĠ Ġ. where Any Contact Data Part ially Matches (" john ") Ċ Ġ* ĠĠĠĠĠ Ġ. orderBy ( DisplayName Primary . asc ()) Ċ Ġ* ĠĠĠĠĠ Ġ. offset ( 5 ) Ċ Ġ* ĠĠĠĠĠ Ġ. limit ( 1 0 ) Ċ Ġ* ĠĠĠĠĠ Ġ. find () Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ## ĠHow Ġdoes Ġthe Ġmatching Ġprocess Ġwork ? Ċ Ġ* Ċ Ġ* ĠThis Ġquery Ġlets Ġthe ĠContact s ĠProvider Ġperform Ġthe Ġsearch Ġusing Ġits Ġown Ġcustom Ġmatching Ġalgorithm . Ċ Ġ* Ċ Ġ* ĠMost , Ġbut Ġnot Ġall , ĠContact Ġdata Ġare Ġincluded Ġin Ġthe Ġmatching Ġprocess . ĠSome Ġare Ġnot Ġprobably Ċ Ġ* Ġbecause Ġsome Ġdata Ġmay Ġresult Ġin Ġun int ention al Ġmatching . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ Abstract Data FieldSet . for Matching ] Ġdocumentation Ġon Ġall Ġthe Ġfields Ġthat Ġare Ġincluded Ġin Ċ Ġ* Ġthis Ġmatch . Ċ Ġ* Ċ Ġ* Ġ** Custom Ġdata Ġare Ġnot Ġincluded Ġin Ġthe Ġmatching Ġprocess ! ** ĠTo Ġmatch Ġcustom Ġdata , Ġuse Ġ[ Query ]. Ċ Ġ* Ċ Ġ* ĠData Ġmatching Ġis Ġmore Ġs oph istic ated Ġunder Ġthe Ġh ood Ġthan Ġ[ Query ]. ĠThe ĠContact s ĠProvider Ġmatches Ċ Ġ* Ġparts Ġof Ġseveral Ġtypes Ġof Ġdata Ġin Ġsegments . ĠFor Ġexample , Ġa ĠContact Ġhaving Ġthe Ġemail Ċ Ġ* Ġ" ho log ram @ gram . net " Ġwill Ġbe Ġmatched Ġwith Ġthe Ġfollowing Ġtexts ; Ċ Ġ* Ċ Ġ* Ġ- Ġh Ċ Ġ* Ġ- ĠHO LO Ċ Ġ* Ġ- Ġ@ g Ċ Ġ* Ġ- Ġ@ gram . net Ċ Ġ* Ġ- Ġgram @ Ċ Ġ* Ġ- Ġnet Ċ Ġ* Ġ- Ġho lo . net Ċ Ġ* Ġ- Ġho log ram . net Ċ Ġ* Ċ Ġ* ĠBut Ġwill ĠNOT Ġbe Ġmatched Ġwith Ġthe Ġfollowing Ġtexts ; Ċ Ġ* Ċ Ġ* Ġ- Ġo lo Ċ Ġ* Ġ- Ġ@ Ċ Ġ* Ġ- Ġgram @ gram Ċ Ġ* Ġ- Ġam @ gram . net Ċ Ġ* Ċ Ġ* ĠSimilar ly , Ġa ĠContact Ġhaving Ġthe Ġname Ġ" Z ack ĠAir " Ġwill Ġbe Ġmatched Ġwith Ġthe Ġfollowing Ġtexts ; Ċ Ġ* Ċ Ġ* Ġ- Ġz Ċ Ġ* Ġ- Ġz ack Ċ Ġ* Ġ- Ġz ack , Ġair Ċ Ġ* Ġ- Ġair , Ġz ack Ċ Ġ* Ġ- Ġza Ġa Ċ Ġ* Ġ- Ġ, Ġz Ċ Ġ* Ġ- Ġ, Ġa Ċ Ġ* Ġ- Ġ, a Ċ Ġ* Ċ Ġ* ĠBut Ġwill ĠNOT Ġbe Ġmatched Ġwith Ġthe Ġfollowing Ġtexts ; Ċ Ġ* Ċ Ġ* Ġ- Ġack Ċ Ġ* Ġ- Ġir Ċ Ġ* Ġ- Ġ, Ċ Ġ* Ċ Ġ* ĠAnother Ġexample Ġis Ġa ĠContact Ġhaving Ġthe Ġnote Ġ" L ots ĠĠ Ġof ĠĠ Ġsp a ĠĠĠĠĠĠĠ Ġces ." Ġwill Ġbe Ġmatched Ġwith Ċ Ġ* Ġthe Ġfollowing Ġtexts ; Ċ Ġ* Ċ Ġ* Ġ- Ġl Ċ Ġ* Ġ- Ġlots Ċ Ġ* Ġ- Ġlots Ġof Ċ Ġ* Ġ- Ġof Ġlots Ċ Ġ* Ġ- Ġces Ġsp a ĠĠĠĠĠĠ Ġlots Ġof . Ċ Ġ* Ġ- Ġlo Ġo Ġsp Ġce Ġ. Ġ. Ġ. Ġ. Ġ. Ċ Ġ* Ċ Ġ* ĠBut Ġwill ĠNOT Ġbe Ġmatched Ġwith Ġthe Ġfollowing Ġtexts ; Ċ Ġ* Ċ Ġ* Ġ- Ġ. Ċ Ġ* Ġ- Ġo ts Ċ Ġ* Ċ Ġ* ĠSe veral Ġtypes Ġof Ġdata Ġare Ġmatched Ġin Ġsegments . ĠE . G . ĠA ĠContact Ġwith Ġdisplay Ġname Ġ" B ell ĠZ ee " Ġand Ċ Ġ* Ġphone Ġnumbers Ġ" 9 8 7 ", Ġ" 1 Ġ 2 3 ", Ġand Ġ" 4 5 6 " Ġwill Ġbe Ġmatched Ġwith Ġ" be Ġb ell Ġze Ġ 9 Ġ 1 2 3 Ġ 1 Ġ 9 8 Ġ 4 5 6 ". Ċ Ġ* Ċ Ġ* ĠMatch ing Ġis Ġ** case - ins ensitive ** Ġ( case Ġis Ġignored ). Ċ Ġ*/ Ċ interface ĠBroad Query Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġ[ include Bl anks ] Ġis Ġset Ġto Ġtrue , Ġthen Ġqueries Ġmay Ġinclude Ġblank ĠRaw Contacts . ĠOtherwise , ĊĠĠĠĠ Ġ* Ġbl anks Ġare Ġnot Ġguaranteed Ġto Ġbe Ġincluded . ĠThis Ġflag Ġis Ġset Ġto Ġtrue Ġby Ġdefault , Ġwhich Ġresults ĊĠĠĠĠ Ġ* Ġin Ġmore Ġdatabase Ġqueries Ġso Ġsetting Ġthis Ġto Ġfalse Ġwill Ġincrease Ġperformance , Ġespecially Ġfor ĊĠĠĠĠ Ġ* Ġlarge ĠContact s Ġdatabases . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe ĠContact s ĠPro viders Ġallows Ġfor ĠRaw Contacts Ġthat Ġhave Ġno Ġrows Ġin Ġthe ĠData Ġtable Ġ( let 's Ġcall ĊĠĠĠĠ Ġ* Ġthem Ġ" bl anks ") Ġto Ġexist . ĠThe Ġnative ĠContact s Ġapp Ġdoes Ġnot Ġallow Ġinsertion Ġof Ġnew ĠRaw Contacts ĊĠĠĠĠ Ġ* Ġwithout Ġat Ġleast Ġone Ġdata Ġrow . ĠIt Ġalso Ġdeletes Ġbl anks Ġon Ġupdate . ĠDes p ite Ġseem ingly Ġnot ĊĠĠĠĠ Ġ* Ġallowing Ġbl anks , Ġthe Ġnative ĠContact s Ġapp Ġshows Ġthem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġscenarios Ġwhere Ġbl anks Ġmay Ġnot Ġbe Ġreturned Ġif Ġthis Ġflag Ġis Ġset Ġto Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . ĠContact Ġwith ĠRaw Contact ( s ) Ġwith Ġno ĠData Ġrow ( s ). ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ- ĠIn Ġthis Ġcase , Ġthe ĠContact Ġis Ġblank Ġas Ġwell Ġas Ġits ĠRaw Contact ( s ). ĊĠĠĠĠ Ġ* Ġ 2 . ĠContact Ġthat Ġhas Ġa ĠRaw Contact Ġwith ĠData Ġrow ( s ) Ġand Ġa ĠRaw Contact Ġwith Ġno ĠData Ġrows . ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ- ĠIn Ġthis Ġcase , Ġthe ĠContact Ġand Ġthe ĠRaw Contact Ġwith ĠData Ġrow ( s ) Ġare Ġnot Ġblank Ġbut Ġthe ĊĠĠĠĠ Ġ* ĠĠĠĠ ĠRaw Contact Ġwith Ġno ĠData Ġrow Ġis Ġblank . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPerformance ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmay Ġrequire Ġone Ġor Ġmore Ġadditional Ġqueries , Ġinternally Ġperformed Ġin Ġthis Ġfunction , Ġwhich ĊĠĠĠĠ Ġ* Ġincreases Ġthe Ġtime Ġit Ġtakes Ġfor Ġ[ find ] Ġto Ġcomplete . ĠTherefore , Ġyou Ġshould Ġonly Ġspecify Ġthis ĊĠĠĠĠ Ġ* Ġif Ġyou Ġactually Ġneed Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinclude Bl anks ( include Bl anks : ĠBoolean ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLim its Ġthe Ġsearch Ġto Ġonly Ġthose ĠRaw Contacts Ġassociated Ġwith Ġone Ġof Ġthe Ġgiven Ġaccounts . ĊĠĠĠĠ Ġ* ĠContact s Ġreturned Ġmay Ġstill Ġcontain ĠRaw Contacts Ġ/ Ġdata Ġthat Ġbelongs Ġto Ġother Ġaccounts Ġnot ĊĠĠĠĠ Ġ* Ġspecified Ġin Ġ[ accounts ] Ġbecause ĠContact s Ġmay Ġbe Ġmade Ġup Ġof Ġmore Ġthan Ġone ĠRaw Contact Ġfrom ĊĠĠĠĠ Ġ* Ġdifferent ĠAccounts . ĠThis Ġis Ġthe Ġsame Ġbehavior Ġas Ġthe Ġnative ĠContact s Ġapp . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġno Ġaccounts Ġare Ġspecified Ġ( this Ġfunction Ġis Ġnot Ġcalled Ġor Ġcalled Ġwith Ġno ĠAccounts ), Ġthen ĊĠĠĠĠ Ġ* Ġall ĠRaw Contacts Ġof ĠContact s Ġare Ġincluded Ġin Ġthe Ġsearch . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġnull Ġ[ Account ] Ġmay Ġbe Ġprovided Ġhere , Ġwhich Ġresults Ġin ĠRaw Contacts Ġwith Ġno Ġassociated ĊĠĠĠĠ Ġ* ĠAccount Ġto Ġbe Ġincluded Ġin Ġthe Ġsearch . ĠRaw Contacts Ġwithout Ġan Ġassociated Ġaccount Ġare ĊĠĠĠĠ Ġ* Ġconsidered Ġlocal Ġcontacts Ġor Ġdevice - only Ġcontacts , Ġwhich Ġare Ġnot Ġsynced . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPerformance ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmay Ġrequire Ġone Ġor Ġmore Ġadditional Ġqueries , Ġinternally Ġperformed Ġin Ġthis Ġfunction , Ġwhich ĊĠĠĠĠ Ġ* Ġincreases Ġthe Ġtime Ġit Ġtakes Ġfor Ġ[ find ] Ġto Ġcomplete . ĠTherefore , Ġyou Ġshould Ġonly Ġspecify Ġthis ĊĠĠĠĠ Ġ* Ġif Ġyou Ġactually Ġneed Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġaccounts ( var arg Ġaccounts : ĠAccount ?): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . accounts ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġaccounts ( accounts : ĠCollection < Account ?> ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . accounts ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġaccounts ( accounts : ĠSequence < Account ?> ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLim its Ġthe Ġsearch Ġto Ġonly Ġthose ĠRaw Contacts Ġassociated Ġwith Ġat Ġleast Ġone Ġof Ġthe Ġgiven Ġgroups . ĊĠĠĠĠ Ġ* ĠContact s Ġreturned Ġmay Ġstill Ġcontain ĠRaw Contacts Ġ/ Ġdata Ġthat Ġbelongs Ġto Ġother Ġgroups Ġnot ĊĠĠĠĠ Ġ* Ġspecified Ġin Ġ[ groups ] Ġbecause ĠContact s Ġmay Ġbe Ġmade Ġup Ġof Ġmore Ġthan Ġone ĠRaw Contact Ġfrom ĊĠĠĠĠ Ġ* Ġdifferent ĠGroups . ĠThis Ġis Ġthe Ġsame Ġbehavior Ġas Ġthe Ġnative ĠContact s Ġapp . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġno Ġgroups Ġare Ġspecified Ġ( this Ġfunction Ġis Ġnot Ġcalled Ġor Ġcalled Ġwith Ġno ĠGroups ), Ġthen Ġall ĊĠĠĠĠ Ġ* ĠRaw Contacts Ġof ĠContact s Ġare Ġincluded Ġin Ġthe Ġsearch . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPerformance ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmay Ġrequire Ġone Ġor Ġmore Ġadditional Ġqueries , Ġinternally Ġperformed Ġin Ġthis Ġfunction , Ġwhich ĊĠĠĠĠ Ġ* Ġincreases Ġthe Ġtime Ġit Ġtakes Ġfor Ġ[ find ] Ġto Ġcomplete . ĠTherefore , Ġyou Ġshould Ġonly Ġspecify Ġthis ĊĠĠĠĠ Ġ* Ġif Ġyou Ġactually Ġneed Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgroups ( var arg Ġgroups : ĠGroup ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . groups ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgroups ( groups : ĠCollection < Group >): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . groups ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgroups ( groups : ĠSequence < Group >): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIncludes Ġonly Ġthe Ġgiven Ġset Ġof Ġ[ fields ] Ġ( data ) Ġin Ġeach Ġof Ġthe Ġmatching Ġcontacts . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġmatching Ġcontacts Ġ** may ** Ġhave Ġnon - null Ġdata Ġfor Ġeach Ġof Ġthe Ġincluded Ġfields . ĠFields ĊĠĠĠĠ Ġ* Ġthat Ġare Ġincluded Ġwill Ġnot Ġguarantee Ġnon - null Ġdata Ġin Ġthe Ġreturned Ġcontact Ġinstances Ġbecause ĊĠĠĠĠ Ġ* Ġsome Ġdata Ġmay Ġactually Ġbe Ġnull Ġin Ġthe Ġdatabase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġno Ġfields Ġare Ġspecified , Ġthen Ġall Ġfields Ġare Ġincluded . ĠOtherwise , Ġonly Ġthe Ġspecified ĊĠĠĠĠ Ġ* Ġfields Ġwill Ġbe Ġincluded Ġin Ġaddition Ġto Ġrequired ĠAPI Ġfields Ġ[ Fields . Required ] Ġ( e . g . ĠIDs ), ĊĠĠĠĠ Ġ* Ġwhich Ġare Ġalways Ġincluded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġmay Ġaffect Ġperformance . ĠIt Ġis Ġrecommended Ġto Ġonly Ġinclude Ġfields Ġthat Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġused Ġto Ġsave ĠCPU Ġand Ġmemory . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPerform ing Ġupdates Ġon Ġentities Ġwith Ġpartial Ġincludes ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġquery Ġ[ include ] Ġfunction Ġis Ġused , Ġonly Ġcertain Ġdata Ġwill Ġbe Ġincluded Ġin Ġthe Ġreturned ĊĠĠĠĠ Ġ* Ġentities . ĠAll Ġother Ġdata Ġare Ġguaranteed Ġto Ġbe Ġnull Ġ( except Ġfor Ġthose Ġin Ġ[ Fields . Required ]). ĊĠĠĠĠ Ġ* ĠWhen Ġperforming Ġupdates Ġon Ġentities Ġthat Ġhave Ġonly Ġpartial Ġdata Ġincluded , Ġmake Ġsure Ġto Ġuse ĊĠĠĠĠ Ġ* Ġthe Ġsame Ġincluded Ġfields Ġin Ġthe Ġupdate Ġoperation Ġas Ġthe Ġincluded Ġfields Ġused Ġin Ġthe Ġquery . ĊĠĠĠĠ Ġ* ĠThis Ġwill Ġensure Ġthat Ġthe Ġset Ġof Ġdata Ġqueried Ġand Ġupdated Ġare Ġthe Ġsame . ĠFor Ġexample , Ġin Ġorder ĊĠĠĠĠ Ġ* Ġto Ġget Ġand Ġset Ġonly Ġemail Ġaddresses Ġand Ġleave Ġeverything Ġthe Ġsame Ġin Ġthe Ġdatabase ... ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* Ġval Ġcontacts Ġ= Ġquery . include ( Fields . Email . Address ). find () ĊĠĠĠĠ Ġ* Ġval Ġmutable Contacts Ġ= Ġset Email Addresses ( contacts ) ĊĠĠĠĠ Ġ* Ġupdate . contacts ( mutable Contacts ). include ( Fields . Email . Address ). commit () ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOn Ġthe Ġother Ġhand , Ġyou Ġmay Ġintention ally Ġinclude Ġonly Ġsome Ġdata Ġand Ġperform Ġupdates Ġwithout ĊĠĠĠĠ Ġ* Ġon Ġall Ġdata Ġ( not Ġjust Ġthe Ġincluded Ġones ) Ġto Ġeffectively Ġdelete Ġall Ġnon - included Ġdata . ĠThis ĊĠĠĠĠ Ġ* Ġis , Ġcurrently , Ġa Ġfeature - Ġnot Ġa Ġbug ! ĠFor Ġexample , Ġin Ġorder Ġto Ġget Ġand Ġset Ġonly Ġemail ĊĠĠĠĠ Ġ* Ġaddresses Ġand Ġset Ġall Ġother Ġdata Ġto Ġnull Ġ( such Ġas Ġphone Ġnumbers , Ġname , Ġetc ) Ġin Ġthe Ġdatabase .. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* Ġval Ġcontacts Ġ= Ġquery . include ( Fields . Email . Address ). find () ĊĠĠĠĠ Ġ* Ġval Ġmutable Contacts Ġ= Ġset Email Addresses ( contacts ) ĊĠĠĠĠ Ġ* Ġupdate . contacts ( mutable Contacts ). include ( Fields . all ). commit () ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġgives Ġyou Ġthe Ġmost Ġflexibility Ġwhen Ġit Ġcomes Ġto Ġspecifying Ġwhat Ġfields Ġto ĊĠĠĠĠ Ġ* Ġinclude / exclude Ġin Ġqueries , Ġinserts , Ġand Ġupdate , Ġwhich Ġwill Ġallow Ġyou Ġto Ġdo Ġthings Ġbeyond ĊĠĠĠĠ Ġ* Ġyour Ġw il dest Ġimag ination ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinclude ( var arg Ġfields : ĠAbstract Data Field ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . include ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinclude ( fields : ĠCollection < Abstract Data Field >): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . include ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinclude ( fields : ĠSequence < Abstract Data Field >): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFilters Ġthe Ġ[ Contact ] s Ġpartially Ġmatching Ġthe Ġ[ search String ]. ĠIf Ġnot Ġspecified Ġor Ġnull Ġor ĊĠĠĠĠ Ġ* Ġempty , Ġthen Ġall Ġ[ Contact ] s Ġare Ġreturned . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Custom Ġdata Ġare Ġnot Ġincluded Ġin Ġthe Ġmatching Ġprocess ! ** ĠTo Ġmatch Ġcustom Ġdata , Ġuse Ġ[ Query ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġmore Ġinfo , Ġsee Ġ[ Broad Query ] Ġ** How Ġdoes Ġthe Ġmatching Ġprocess Ġwork ?** Ġsection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPerformance ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmay Ġrequire Ġone Ġor Ġmore Ġadditional Ġqueries , Ġinternally Ġperformed Ġin Ġthis Ġfunction , Ġwhich ĊĠĠĠĠ Ġ* Ġincreases Ġthe Ġtime Ġit Ġtakes Ġfor Ġ[ find ] Ġto Ġcomplete . ĠTherefore , Ġyou Ġshould Ġonly Ġspecify Ġthis ĊĠĠĠĠ Ġ* Ġif Ġyou Ġactually Ġneed Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwhere Any Contact Data Part ially Matches ( search String : ĠString ?): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOrders Ġthe Ġ[ Contact ] s Ġusing Ġone Ġor Ġmore Ġ[ orderBy ] s . ĠIf Ġnot Ġspecified , Ġthen Ġcontacts Ġare ĊĠĠĠĠ Ġ* Ġordered Ġby ĠID Ġin Ġascending Ġorder . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠString Ġcomparisons Ġignores Ġcase Ġby Ġdefault . ĠEach Ġ[ orderBy ] s Ġprovides Ġ` ignore Case ` Ġas Ġan ĊĠĠĠĠ Ġ* Ġoptional Ġparameter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġ[ Contacts Fields ] Ġto Ġconstruct Ġthe Ġ[ orderBy ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġneed Ġto Ġsort Ġa Ġcollection Ġof ĠContact s Ġoutside Ġof Ġa Ġdatabase Ġquery Ġusing Ġany Ġfield ĊĠĠĠĠ Ġ* Ġ( in Ġaddition Ġto Ġ[ Contacts Fields ]), Ġuse Ġ[ contacts . core . util . Contacts Comparator ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠDeveloper ĠNotes ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis ĠAPI ĠDO ES ĠNOT Ġsupport Ġordering Ġby ĠData Ġtable Ġcolumns Ġ([ Fields ]). ĠIt Ġused Ġto Ġsupport Ġit ĊĠĠĠĠ Ġ* Ġbut Ġit Ġhas Ġbeen Ġremoved Ġfor Ġoptimization Ġpurposes . ĠThis Ġnow Ġonly Ġsupports Ġordering Ġby ĊĠĠĠĠ Ġ* ĠContact s Ġtable Ġfields Ġ([ Contacts Fields ]). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** If Ġthis Ġsupported Ġordering Ġby ĠData Ġtable Ġfields **, Ġthen Ġit Ġwould Ġbe Ġunable Ġto Ġuse Ġthe ĊĠĠĠĠ Ġ* ĠORDER ĠBY , ĠLIMIT , Ġand ĠOFFSET Ġfunctions Ġof Ġa Ġraw Ġdatabase Ġquery Ġand Ġcustom Ġordering Ġvia ĊĠĠĠĠ Ġ* ĠComp ar ators Ġis Ġrequired . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe ĠData Ġtable Ġuses Ġgeneric Ġcolumn Ġnames Ġ( e . g . Ġdata 1 , Ġdata 2 , Ġ...) Ġusing Ġthe Ġcolumn Ġ' mime type ' ĊĠĠĠĠ Ġ* Ġto Ġdistinguish Ġthe Ġtype Ġof Ġdata Ġin Ġthat Ġgeneric Ġcolumn . ĠFor Ġexample , Ġthe Ġcolumn Ġname Ġof ĊĠĠĠĠ Ġ* Ġ[ Name Fields . DisplayName ] Ġis Ġthe Ġsame Ġas Ġ[ Address Fields . Formatted Address ], Ġwhich Ġis Ġ' data 1 '. ĊĠĠĠĠ Ġ* ĠThis Ġmeans Ġthat Ġif Ġyou Ġorder Ġby Ġthe Ġdisplay Ġname , Ġyou Ġare Ġalso Ġordering Ġby Ġthe Ġformatted ĊĠĠĠĠ Ġ* Ġaddress Ġand Ġall Ġother Ġcolumns Ġwhose Ġvalue Ġis Ġ' data 1 '. ĠThis ĠAPI Ġcould Ġwork Ġaround Ġthis ĊĠĠĠĠ Ġ* Ġlimitation Ġby Ġperforming Ġthe Ġordering , Ġlimiting , Ġand Ġoffset ting Ġmanually Ġafter ĊĠĠĠĠ Ġ* Ġ** all Ġmatching ** Ġcontacts Ġhave Ġbeen Ġretrieved Ġbefore Ġreturning Ġit Ġto Ġthe Ġconsumer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthere Ġis Ġno Ġworkaround Ġfor Ġthe Ġ[ include ] Ġfunction Ġbecause Ġthe ĊĠĠĠĠ Ġ* Ġ[ Content Resolver . query ] Ġfunction Ġonly Ġtakes Ġin Ġan Ġarray Ġof Ġcolumn Ġnames . ĠThis Ġmeans Ġthat ĊĠĠĠĠ Ġ* Ġincluding Ġ[ Name Fields . DisplayName ] Ġ(' data 1 ') Ġwill Ġalso Ġresult Ġin Ġthe Ġinclusion Ġof ĊĠĠĠĠ Ġ* Ġ[ Address Fields . Formatted Address ] Ġ(' data 1 '). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Safe Var args ĊĠĠĠ Ġfun ĠorderBy ( var arg ĠorderBy : ĠOrder By < Contacts Field >): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . orderBy ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠorderBy ( orderBy : ĠCollection < OrderBy < Contacts Field >> ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Broad Query . orderBy ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠorderBy ( orderBy : ĠSequence < OrderBy < Contacts Field >> ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLim its Ġthe Ġmaximum Ġnumber Ġof Ġreturned Ġ[ Contact ] s Ġto Ġthe Ġgiven Ġ[ limit ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġnot Ġspecified , Ġlimit Ġvalue Ġof Ġ[ Int . MAX _ VALUE ] Ġis Ġused . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlimit ( limit : ĠInt ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSk ips Ġresults Ġ 0 Ġto Ġ[ offset ] Ġ( ex cluding Ġthe Ġoffset ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġnot Ġspecified , Ġoffset Ġvalue Ġof Ġ 0 Ġis Ġused . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoffset ( offset : ĠInt ): ĠBroad Query ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġ[ Contact ] s Ġmatching Ġthe Ġpreceding Ġquery Ġoptions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPermissions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠRequires Ġ[ Contacts Permissions . READ _ PERMISSION ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## Ġ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 (): ĠList < Contact > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġ[ Contact ] s Ġmatching Ġthe Ġpreceding Ġquery Ġoptions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPermissions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠRequires Ġ[ Contacts Permissions . READ _ PERMISSION ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠC ancellation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġcontacts Ġand Ġcontact Ġdata Ġfound Ġand Ġprocessed Ġmay Ġbe Ġlarge , Ġwhich Ġresults ĊĠĠĠĠ Ġ* Ġin Ġthis Ġoperation Ġto Ġtake Ġa Ġwhile . ĠTherefore , Ġcancellation Ġis Ġsupported Ġwhile Ġthe Ġcontacts ĊĠĠĠĠ Ġ* Ġ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 Ġ}): ĠList < Contact > ĊĠĠĠ Ġfun Ġfind ( cancel : Ġ() Ġ-> ĠBoolean ): ĠList < Contact > Ċ } Ċ Ċ @ Suppress (" FunctionName ") Ċ internal Ġfun ĠBroad Query ( contacts : ĠContact s ): ĠBroad Query Ġ= ĠBroad Query Impl ( ĊĠĠĠ Ġcontacts . application Context . content Resolver , ĊĠĠĠ Ġcontacts . permissions , ĊĠĠĠ Ġcontacts . custom Data Registry Ċ ) Ċ Ċ private Ġclass ĠBroad Query Impl ( ĊĠĠĠ Ġprivate Ġval Ġcontent Resolver : ĠContent Resolver , ĊĠĠĠ Ġprivate Ġval Ġpermissions : ĠContact s Permissions , ĊĠĠĠ Ġprivate Ġval Ġcustom Data Registry : ĠCustom Data Registry , ĊĊĠĠĠ Ġprivate Ġvar Ġinclude Bl anks : ĠBoolean Ġ= ĠDEFAULT _ INCLUDE _ BL AN KS , ĊĠĠĠ Ġprivate Ġvar Ġraw Contacts Where : ĠWhere < Raw Contacts Field >? Ġ= ĠDEFAULT _ RAW _ CONTACT S _ WHERE , ĊĠĠĠ Ġprivate Ġvar Ġgroup Membership Where : ĠWhere < Group Membership Field >? Ġ= ĠDEFAULT _ GROUP _ MEMBER SHIP _ WHERE , ĊĠĠĠ Ġprivate Ġvar Ġinclude : ĠInclude < Abstract Data Field > Ġ= Ġall Data Fields ( custom Data Registry ), ĊĠĠĠ Ġprivate Ġvar Ġsearch String : ĠString ? Ġ= ĠDEFAULT _ SEARCH _ STRING , ĊĠĠĠ Ġprivate Ġvar ĠorderBy : ĠCompound OrderBy < Contacts Field > Ġ= ĠDEFAULT _ ORDER _ BY , ĊĠĠĠ Ġprivate Ġvar Ġlimit : ĠInt Ġ= ĠDEFAULT _ LIMIT , ĊĠĠĠ Ġprivate Ġvar Ġoffset : ĠInt Ġ= ĠDEFAULT _ OFFSET Ċ ) Ġ: ĠBroad Query Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBroad Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Bl anks : Ġ$ include Bl anks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Contacts Where : Ġ$ raw Contacts Where ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Membership Where : Ġ$ group Membership Where ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude : Ġ$ include ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch String : Ġ$ search String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy : Ġ$ orderBy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit : Ġ$ limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : Ġ$ offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġoverride Ġfun Ġinclude Bl anks ( include Bl anks : ĠBoolean ): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . include Bl anks Ġ= Ġinclude Bl anks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġaccounts ( var arg Ġaccounts : ĠAccount ?) Ġ= Ġaccounts ( accounts . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun Ġaccounts ( accounts : ĠCollection < Account ?> ) Ġ= Ġaccounts ( accounts . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun Ġaccounts ( accounts : ĠSequence < Account ?> ): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġraw Contacts Where Ġ= Ġaccounts . to Raw Contacts Where () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgroups ( var arg Ġgroups : ĠGroup ) Ġ= Ġgroups ( groups . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun Ġgroups ( groups : ĠCollection < Group >) Ġ= Ġgroups ( groups . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun Ġgroups ( groups : ĠSequence < Group >): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroup Ids Ġ= Ġgroups . map NotNull Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġgroup Membership Where Ġ= Ġif Ġ( group Ids . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ GROUP _ MEMBER SHIP _ WHERE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFields . Group Membership . GroupId Ġ` in ` Ġgroup Ids ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinclude ( var arg Ġfields : ĠAbstract Data Field ) Ġ= Ġinclude ( fields . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun Ġinclude ( fields : ĠCollection < Abstract Data Field >) Ġ= Ġinclude ( fields . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun Ġinclude ( fields : ĠSequence < Abstract Data Field >): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġinclude Ġ= Ġif Ġ( fields . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Data Fields ( custom Data Registry ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInclude ( fields Ġ+ ĠREQUIRED _ INCLUDE _ FIELDS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwhere Any Contact Data Part ially Matches ( search String : ĠString ?): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠYes , ĠI Ġknow ĠDEFAULT _ SEARCH _ STRING Ġis Ġnull . ĠThis Ġreads Ġbetter Ġthough . ĊĠĠĠĠĠĠĠ Ġthis . search String Ġ= Ġsearch String Ġ?: ĠDEFAULT _ SEARCH _ STRING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠorderBy ( var arg ĠorderBy : ĠOrder By < Contacts Field >) Ġ= ĠorderBy ( orderBy . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun ĠorderBy ( orderBy : ĠCollection < OrderBy < Contacts Field >>) Ġ= ĊĠĠĠĠĠĠĠ ĠorderBy ( orderBy . as Sequence ()) ĊĊĠĠĠ Ġoverride Ġfun ĠorderBy ( orderBy : ĠSequence < OrderBy < Contacts Field >> ): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . orderBy Ġ= Ġif Ġ( orderBy . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ ORDER _ BY ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompound OrderBy ( orderBy . toSet ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlimit ( limit : ĠInt ): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . limit Ġ= Ġif Ġ( limit Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Limit Ġmust Ġbe Ġgreater Ġthan Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġoffset ( offset : ĠInt ): ĠBroad Query Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . offset Ġ= Ġif Ġ( offset Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Offset Ġmust Ġbe Ġgreater Ġthan Ġor Ġequal Ġto Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind (): ĠList < Contact > Ġ= Ġfind Ġ{ Ġfalse Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind ( cancel : Ġ() Ġ-> ĠBoolean ): ĠList < Contact > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! permissions . can Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Data Registry , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Bl anks , Ġraw Contacts Where , Ġgroup Membership Where , Ġinclude , Ġsearch String , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy , Ġlimit , Ġoffset , Ġcancel ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ INCLUDE _ BL AN KS Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ RAW _ CONTACT S _ WHERE : ĠWhere < Raw Contacts Field >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ GROUP _ MEMBER SHIP _ WHERE : ĠWhere < Group Membership Field >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval ĠREQUIRED _ INCLUDE _ FIELDS Ġby Ġunsafe Lazy Ġ{ ĠFields . Required . all . as Sequence () Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ SEARCH _ STRING : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ ORDER _ BY Ġby Ġunsafe Lazy Ġ{ ĠCompound OrderBy ( set Of ( Contacts Fields . Id . asc ())) Ġ} ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ LIMIT Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ OFFSET Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠContent Resolver . resolve ( ĊĠĠĠ Ġcustom Data Registry : ĠCustom Data Registry , ĊĠĠĠ Ġinclude Bl anks : ĠBoolean , ĊĠĠĠ Ġraw Contacts Where : ĠWhere < Raw Contacts Field > ?, ĊĠĠĠ Ġgroup Membership Where : ĠWhere < Group Membership Field > ?, ĊĠĠĠ Ġinclude : ĠInclude < Abstract Data Field >, ĊĠĠĠ Ġsearch String : ĠString ?, ĊĠĠĠ ĠorderBy : ĠCompound OrderBy < Contacts Field >, ĊĠĠĠ Ġlimit : ĠInt , ĊĠĠĠ Ġoffset : ĠInt , ĊĠĠĠ Ġcancel : Ġ() Ġ-> ĠBoolean Ċ ): ĠList < Contact > Ġ{ ĊĊĠĠĠ Ġvar Ġcontact Ids : ĠMutable Set < Long >? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠGet ĠContact ĠI ds Ġpartially Ġmatching Ġthe Ġsearch String Ġfrom Ġthe ĠContact s Ġtable . ĠIf Ġsearch String ĊĠĠĠ Ġ// Ġis Ġnull , Ġskip . ĊĠĠĠ Ġif Ġ( search String Ġ!= Ġnull Ġ&& Ġsearch String . isNotEmpty () Ġ&& Ġ! cancel ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontact Ids Ġ= Ġmutable Set Of < Long >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( find Contact Ids In Contacts Table ( search String , Ġcancel )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġmatch , Ġreturn Ġempty Ġlist . ĊĠĠĠĠĠĠĠ Ġif Ġ( contact Ids . isEmpty () Ġ|| Ġcancel ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGet Ġthe ĠContact ĠI ds Ġmatching Ġgroup Membership Where Ġand Ġcontained Ġin Ġthe Ġcontact Ids Ġfrom Ġthe ĊĠĠĠ Ġ// ĠData Ġtable . ĠIf Ġgroup Membership Where Ġis Ġnull , Ġskip . ĊĠĠĠ Ġif Ġ( group Membership Where Ġ!= Ġnull Ġ&& Ġ! cancel ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Table Where Ġ= Ġgroup Membership Where Ġand Ġcontact Ids ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFields . Contact . Id Ġ` in ` Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInt ention ally Ġreplace Ġthe Ġcontacts Ids Ġinstead Ġof Ġadding Ġto Ġit . ĊĠĠĠĠĠĠĠ Ġcontact Ids Ġ= Ġmutable Set Of < Long >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( find Contact Ids In DataTable ( dataTable Where , Ġcancel )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġmatch , Ġreturn Ġempty Ġlist . ĊĠĠĠĠĠĠĠ Ġif Ġ( contact Ids . isEmpty () Ġ|| Ġcancel ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠGet Ġthe ĠContact ĠI ds Ġmatching Ġraw Contacts Where Ġand Ġcontained Ġin Ġthe Ġcontact Ids Ġfrom Ġthe ĊĠĠĠ Ġ// ĠRaw Contacts Ġtable . ĠIf Ġraw Contacts Where Ġis Ġnull , Ġskip . ĊĠĠĠ Ġif Ġ( raw Contacts Where Ġ!= Ġnull Ġ&& Ġ! cancel ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Contacts Table Where Ġ= Ġraw Contacts Where Ġand Ġcontact Ids ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRaw Contacts Fields . Contact Id Ġ` in ` Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInt ention ally Ġreplace Ġthe Ġcontacts Ids Ġinstead Ġof Ġadding Ġto Ġit . ĊĠĠĠĠĠĠĠ Ġcontact Ids Ġ= Ġmutable Set Of < Long >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( find Contact Ids In Raw Contacts Table ( raw Contacts Table Where , Ġcancel , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġmatch , Ġreturn Ġempty Ġlist . ĊĠĠĠĠĠĠĠ Ġif Ġ( contact Ids . isEmpty () Ġ|| Ġcancel ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresolve ( ĊĠĠĠĠĠĠĠ Ġcustom Data Registry , Ġcontact Ids , Ġinclude Bl anks , Ġinclude , ĠorderBy , Ġlimit , Ġoffset , Ġcancel ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠContent Resolver . find Contact Ids In Contacts Table ( ĊĠĠĠ Ġsearch String : ĠString , Ġcancel : Ġ() Ġ-> ĠBoolean Ċ ): ĠSet < Long > Ġ= Ġquery ( ĊĠĠĠ ĠUri . with App ended Path ( ĊĠĠĠĠĠĠĠ ĠContact s Contract . Contacts . CONTENT _ FILTER _ URI , ĊĠĠĠĠĠĠĠ ĠUri . encode ( search String ) ĊĠĠĠ Ġ), ĊĠĠĠ ĠInclude ( Contacts Fields . Id ), ĊĠĠĠ Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontact Ids Ġ= Ġmutable Set Of < Long >() ĊĠĠĠ Ġval Ġcontacts Cursor Ġ= Ġit . contacts Cursor () ĊĠĠĠ Ġwhile Ġ(! cancel () Ġ&& Ġit . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontacts Cursor . contact Id ?. let ( contact Ids :: add ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontact Ids Ċ } Ġ?: Ġempty Set () Ċ