/* Ċ Ġ* ĠCreated Ġby Ġn pha u Ġon Ġ 0 1 / 1 1 / 2 0 2 1 , Ġ 0 0 : 5 1 Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġ. ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLast Ġmodified Ġ 0 1 / 1 1 / 2 0 2 1 , Ġ 0 0 : 3 9 Ċ Ġ*/ Ċ Ċ package Ġsg . n pha u . android . shared . libs . file Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Content U ris Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . provider . Media Store Ċ import Ġsg . n pha u . android . shared . libs . timezone . timestamp Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġsg . n pha u . android . shared . data . entities . Media File Ċ import Ġsg . n pha u . android . shared . data . entities . MediaType Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ object ĠMedia Store Utils Ġ{ ĊĊĠĠĠ Ġfun Ġquery Cursor ( ĊĠĠĠĠĠĠĠ Ġcontent Resolver : ĠContent Resolver , ĊĠĠĠĠĠĠĠ Ġid Key : ĠString , ĊĠĠĠĠĠĠĠ Ġcontent Uri Key : ĠUri , ĊĠĠĠĠĠĠĠ Ġdate Added Key : ĠString , ĊĠĠĠĠĠĠĠ Ġdate Modified Key : ĠString , ĊĠĠĠĠĠĠĠ ĠdisplayName Key : ĠString , ĊĠĠĠĠĠĠĠ Ġbucket Key : ĠString ĊĠĠĠ Ġ): ĠCursor ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġkey Ġconcept Ġwhen Ġworking Ġwith ĠAndroid Ġ[ Content Provider ] s Ġis Ġsomething Ġcalled ĊĠĠĠĠĠĠĠĠ Ġ* Ġ" projection s ". ĠA Ġprojection Ġis Ġthe Ġlist Ġof Ġcolumns Ġto Ġrequest Ġfrom Ġthe Ġprovider , ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġcan Ġbe Ġthought Ġof Ġ( qu ite Ġaccur ately ) Ġas Ġthe Ġ" SELECT Ġ..." Ġclause Ġof Ġa ĠSQL ĊĠĠĠĠĠĠĠĠ Ġ* Ġstatement . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt 's Ġnot Ġ_ required _ Ġto Ġprovide Ġa Ġprojection . ĠIn Ġthis Ġcase , Ġone Ġcould Ġpass Ġ` null ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġin Ġplace Ġof Ġ` projection ` Ġin Ġthe Ġcall Ġto Ġ[ Content Resolver . query ], Ġbut Ġrequesting ĊĠĠĠĠĠĠĠĠ Ġ* Ġmore Ġdata Ġthan Ġis Ġrequired Ġhas Ġa Ġperformance Ġimpact . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġthis Ġsample , Ġwe Ġonly Ġuse Ġa Ġfew Ġcolumns Ġof Ġdata , Ġand Ġso Ġwe 'll Ġrequest Ġjust Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġsubset Ġof Ġcolumns . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( id Key , Ġdate Added Key , ĠdisplayName Key , Ġbucket Key ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġ` selection ` Ġis Ġthe Ġ" WHERE Ġ..." Ġclause Ġof Ġa ĠSQL Ġstatement . ĠIt 's Ġalso Ġpossible ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġomit Ġthis Ġby Ġpassing Ġ` null ` Ġin Ġits Ġplace , Ġand Ġthen Ġall Ġrows Ġwill Ġbe Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġthis Ġcase Ġwe 're Ġusing Ġa Ġselection Ġbased Ġon Ġthe Ġdate Ġthe Ġimage Ġwas Ġtaken . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNote Ġthat Ġwe 've Ġincluded Ġa Ġ` ?` Ġin Ġour Ġselection . ĠThis Ġstands Ġin Ġfor Ġa Ġvariable ĊĠĠĠĠĠĠĠĠ Ġ* Ġwhich Ġwill Ġbe Ġprovided Ġby Ġthe Ġnext Ġvariable . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= Ġ"$ date Added Key Ġ>= Ġ? " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġ` selection Args ` Ġis Ġa Ġlist Ġof Ġvalues Ġthat Ġwill Ġbe Ġfilled Ġin Ġfor Ġeach Ġ` ?` ĊĠĠĠĠĠĠĠĠ Ġ* Ġin Ġthe Ġ` selection `. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġselection Args Ġ= ĠarrayOf ( timestamp ( day Ġ= Ġ 2 2 , Ġmonth Ġ= Ġ 1 0 , Ġyear Ġ= Ġ 2 0 0 8 ). toString ()) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSort Ġorder Ġto Ġuse . ĠThis Ġcan Ġalso Ġbe Ġnull , Ġwhich Ġwill Ġuse Ġthe Ġdefault Ġsort Ġorder . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġsort Order Ġ= Ġ"$ date Modified Key ĠDESC " ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( content Uri Key , Ġprojection , Ġselection , Ġselection Args , Ġsort Order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcontent Uri ( content Uri Key : ĠUri , Ġid : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠ ĠContent U ris . with App ended Id ( content Uri Key , Ġid ) ĊĊĠĠĠ Ġclass ĠVideo Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID Ġ= ĠMedia Store . Video . Media ._ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ AD DED Ġ= ĠMedia Store . Video . Media . DATE _ AD DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDISPLAY _ NAME Ġ= ĠMedia Store . Video . Media . DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ MODI FIED Ġ= ĠMedia Store . Video . Media . DATE _ MODI FIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBU CKET _ DISPLAY _ NAME Ġ= ĠMedia Store . Video . Media . BUCKET _ DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXTER NAL _ CONTENT _ URI : ĠUri Ġ= ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWorking Ġwith Ġ[ Content Resolver ] s Ġcan Ġbe Ġslow , Ġso Ġwe 'll Ġdo Ġthis Ġoff Ġthe Ġmain ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthread Ġinside Ġa Ġcoroutine . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġquery Files ( content Resolver : ĠContent Resolver ): ĠList < Media File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideos Ġ= Ġmutable ListOf < Media File >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cursor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Key Ġ= ĠID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver Ġ= Ġcontent Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Key Ġ= ĠEXTER NAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Added Key Ġ= ĠDATE _ AD DED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Modified Key Ġ= ĠDATE _ MODI FIED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Key Ġ= ĠDISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Key Ġ= ĠBU CKET _ DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ Ġcursor Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġorder Ġto Ġretrieve Ġthe Ġdata Ġfrom Ġthe Ġ[ Cursor ] Ġthat 's Ġreturned , Ġwe Ġneed Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġfind Ġwhich Ġindex Ġmatches Ġeach Ġcolumn Ġthat Ġwe 're Ġinterested Ġin . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġways Ġto Ġdo Ġthis . ĠThe Ġfirst Ġis Ġto Ġuse Ġthe Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Cursor . getColumnIndex ] Ġwhich Ġreturns Ġ- 1 Ġif Ġthe Ġcolumn ĠID Ġisn 't Ġfound . ĠThis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġis Ġuseful Ġif Ġthe Ġcode Ġis Ġprogram matically Ġchoosing Ġwhich Ġcolumns Ġto Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġwould Ġlike Ġto Ġuse Ġa Ġsingle Ġmethod Ġto Ġparse Ġthem Ġinto Ġobjects . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġour Ġcase , Ġsince Ġwe Ġknow Ġexactly Ġwhich Ġcolumns Ġwe 'd Ġlike , Ġand Ġwe Ġknow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthat Ġthey Ġmust Ġbe Ġincluded Ġ( since Ġthey 're Ġall Ġsupported Ġfrom ĠAPI Ġ 1 ), Ġwe 'll ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġ[ Cursor . getColumnIndex OrThrow ]. ĠThis Ġmethod Ġwill Ġthrow Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ IllegalArgumentException ] Ġif Ġthe Ġcolumn Ġnamed Ġisn 't Ġfound . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġeither Ġcase , Ġwhile Ġthis Ġmethod Ġisn 't Ġslow , Ġwe 'll Ġwant Ġto Ġcache Ġthe Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto Ġavoid Ġhaving Ġto Ġlook Ġthem Ġup Ġfor Ġeach Ġrow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Col Ġ= Ġcursor . getIndex ( ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Col Ġ= Ġcursor . getIndex ( DATE _ AD DED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Col Ġ= Ġcursor . getIndex ( DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Col Ġ= Ġcursor . getIndex ( BUCKET _ DISPLAY _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere Ġwe 'll Ġuse Ġthe Ġcolumn Ġindex Ġthat Ġwe Ġfound Ġabove . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getLong ( id Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Modified Ġ= Ġcursor . getLong ( date Modified Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Ġ= ĠDate ( TimeUnit . SECONDS . to Millis ( time Modified )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Ġ= Ġcursor . getString ( displayName Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Ġ= Ġcursor . getString ( folder Name Col ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġone Ġof Ġthe Ġtrick iest Ġparts : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSince Ġwe 're Ġaccessing Ġimages Ġ( using ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Media Store . Video . Media . EXTERNAL _ CONTENT _ URI ], Ġwe 'll Ġuse Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġas Ġthe Ġbase ĠURI Ġand Ġappend Ġthe ĠID Ġof Ġthe Ġimage Ġto Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= Ġcontent Uri ( EXTERNAL _ CONTENT _ URI , Ġid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideos Ġ+= ĠMedia File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠdisplayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Ġ= Ġcontent Uri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Name Ġ= Ġfolder Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdate Modified . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Type Ġ= ĠMediaType . VIDEO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvideos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠImage Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID Ġ= ĠMedia Store . Images . Media ._ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ AD DED Ġ= ĠMedia Store . Images . Media . DATE _ AD DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDISPLAY _ NAME Ġ= ĠMedia Store . Images . Media . DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ MODI FIED Ġ= ĠMedia Store . Images . Media . DATE _ MODI FIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBU CKET _ DISPLAY _ NAME Ġ= ĠMedia Store . Images . Media . BUCKET _ DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXTER NAL _ CONTENT _ URI : ĠUri Ġ= ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWorking Ġwith Ġ[ Content Resolver ] s Ġcan Ġbe Ġslow , Ġso Ġwe 'll Ġdo Ġthis Ġoff Ġthe Ġmain ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthread Ġinside Ġa Ġcoroutine . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġquery Files ( content Resolver : ĠContent Resolver ): ĠList < Media File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideos Ġ= Ġmutable ListOf < Media File >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cursor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Key Ġ= ĠID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver Ġ= Ġcontent Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Key Ġ= ĠEXTER NAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Added Key Ġ= ĠDATE _ AD DED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Modified Key Ġ= ĠDATE _ MODI FIED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Key Ġ= ĠDISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Key Ġ= ĠBU CKET _ DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ Ġcursor Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġorder Ġto Ġretrieve Ġthe Ġdata Ġfrom Ġthe Ġ[ Cursor ] Ġthat 's Ġreturned , Ġwe Ġneed Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġfind Ġwhich Ġindex Ġmatches Ġeach Ġcolumn Ġthat Ġwe 're Ġinterested Ġin . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġways Ġto Ġdo Ġthis . ĠThe Ġfirst Ġis Ġto Ġuse Ġthe Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Cursor . getColumnIndex ] Ġwhich Ġreturns Ġ- 1 Ġif Ġthe Ġcolumn ĠID Ġisn 't Ġfound . ĠThis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġis Ġuseful Ġif Ġthe Ġcode Ġis Ġprogram matically Ġchoosing Ġwhich Ġcolumns Ġto Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġwould Ġlike Ġto Ġuse Ġa Ġsingle Ġmethod Ġto Ġparse Ġthem Ġinto Ġobjects . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġour Ġcase , Ġsince Ġwe Ġknow Ġexactly Ġwhich Ġcolumns Ġwe 'd Ġlike , Ġand Ġwe Ġknow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthat Ġthey Ġmust Ġbe Ġincluded Ġ( since Ġthey 're Ġall Ġsupported Ġfrom ĠAPI Ġ 1 ), Ġwe 'll ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġ[ Cursor . getColumnIndex OrThrow ]. ĠThis Ġmethod Ġwill Ġthrow Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ IllegalArgumentException ] Ġif Ġthe Ġcolumn Ġnamed Ġisn 't Ġfound . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġeither Ġcase , Ġwhile Ġthis Ġmethod Ġisn 't Ġslow , Ġwe 'll Ġwant Ġto Ġcache Ġthe Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto Ġavoid Ġhaving Ġto Ġlook Ġthem Ġup Ġfor Ġeach Ġrow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Col Ġ= Ġcursor . getIndex ( ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Col Ġ= Ġcursor . getIndex ( DATE _ AD DED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Col Ġ= Ġcursor . getIndex ( DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Col Ġ= Ġcursor . getIndex ( BUCKET _ DISPLAY _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere Ġwe 'll Ġuse Ġthe Ġcolumn Ġindex Ġthat Ġwe Ġfound Ġabove . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getLong ( id Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Modified Ġ= Ġcursor . getLong ( date Modified Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Ġ= ĠDate ( TimeUnit . SECONDS . to Millis ( time Modified )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Ġ= Ġcursor . getString ( displayName Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Ġ= Ġcursor . getString ( folder Name Col ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġone Ġof Ġthe Ġtrick iest Ġparts : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSince Ġwe 're Ġaccessing Ġimages Ġ( using ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Media Store . Images . Media . EXTERNAL _ CONTENT _ URI ], Ġwe 'll Ġuse Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġas Ġthe Ġbase ĠURI Ġand Ġappend Ġthe ĠID Ġof Ġthe Ġimage Ġto Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= Ġcontent Uri ( EXTERNAL _ CONTENT _ URI , Ġid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideos Ġ+= ĠMedia File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠdisplayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Ġ= Ġcontent Uri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Name Ġ= Ġfolder Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdate Modified . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvideos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAudio Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID Ġ= ĠMedia Store . Audio . Media ._ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ AD DED Ġ= ĠMedia Store . Audio . Media . DATE _ AD DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDISPLAY _ NAME Ġ= ĠMedia Store . Audio . Media . DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ MODI FIED Ġ= ĠMedia Store . Audio . Media . DATE _ MODI FIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBU CKET _ DISPLAY _ NAME Ġ= ĠMedia Store . Audio . Media . BUCKET _ DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXTER NAL _ CONTENT _ URI : ĠUri Ġ= ĠMedia Store . Audio . Media . EXTERNAL _ CONTENT _ URI ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWorking Ġwith Ġ[ Content Resolver ] s Ġcan Ġbe Ġslow , Ġso Ġwe 'll Ġdo Ġthis Ġoff Ġthe Ġmain ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthread Ġinside Ġa Ġcoroutine . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġquery Files ( content Resolver : ĠContent Resolver ): ĠList < Media File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaud ios Ġ= Ġmutable ListOf < Media File >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cursor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Key Ġ= ĠID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver Ġ= Ġcontent Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Key Ġ= ĠEXTER NAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Added Key Ġ= ĠDATE _ AD DED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Modified Key Ġ= ĠDATE _ MODI FIED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Key Ġ= ĠDISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Key Ġ= ĠBU CKET _ DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ Ġcursor Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġorder Ġto Ġretrieve Ġthe Ġdata Ġfrom Ġthe Ġ[ Cursor ] Ġthat 's Ġreturned , Ġwe Ġneed Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġfind Ġwhich Ġindex Ġmatches Ġeach Ġcolumn Ġthat Ġwe 're Ġinterested Ġin . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġways Ġto Ġdo Ġthis . ĠThe Ġfirst Ġis Ġto Ġuse Ġthe Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Cursor . getColumnIndex ] Ġwhich Ġreturns Ġ- 1 Ġif Ġthe Ġcolumn ĠID Ġisn 't Ġfound . ĠThis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġis Ġuseful Ġif Ġthe Ġcode Ġis Ġprogram matically Ġchoosing Ġwhich Ġcolumns Ġto Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġwould Ġlike Ġto Ġuse Ġa Ġsingle Ġmethod Ġto Ġparse Ġthem Ġinto Ġobjects . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġour Ġcase , Ġsince Ġwe Ġknow Ġexactly Ġwhich Ġcolumns Ġwe 'd Ġlike , Ġand Ġwe Ġknow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthat Ġthey Ġmust Ġbe Ġincluded Ġ( since Ġthey 're Ġall Ġsupported Ġfrom ĠAPI Ġ 1 ), Ġwe 'll ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġ[ Cursor . getColumnIndex OrThrow ]. ĠThis Ġmethod Ġwill Ġthrow Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ IllegalArgumentException ] Ġif Ġthe Ġcolumn Ġnamed Ġisn 't Ġfound . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġeither Ġcase , Ġwhile Ġthis Ġmethod Ġisn 't Ġslow , Ġwe 'll Ġwant Ġto Ġcache Ġthe Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto Ġavoid Ġhaving Ġto Ġlook Ġthem Ġup Ġfor Ġeach Ġrow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Col Ġ= Ġcursor . getIndex ( ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Col Ġ= Ġcursor . getIndex ( DATE _ AD DED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Col Ġ= Ġcursor . getIndex ( DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Col Ġ= Ġcursor . getIndex ( BUCKET _ DISPLAY _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere Ġwe 'll Ġuse Ġthe Ġcolumn Ġindex Ġthat Ġwe Ġfound Ġabove . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getLong ( id Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Modified Ġ= Ġcursor . getLong ( date Modified Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Ġ= ĠDate ( TimeUnit . SECONDS . to Millis ( time Modified )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Ġ= Ġcursor . getString ( displayName Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Ġ= Ġcursor . getString ( folder Name Col ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġone Ġof Ġthe Ġtrick iest Ġparts : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSince Ġwe 're Ġaccessing Ġimages Ġ( using ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Media Store . Images . Media . EXTERNAL _ CONTENT _ URI ], Ġwe 'll Ġuse Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġas Ġthe Ġbase ĠURI Ġand Ġappend Ġthe ĠID Ġof Ġthe Ġimage Ġto Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= Ġcontent Uri ( EXTERNAL _ CONTENT _ URI , Ġid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaud ios Ġ+= ĠMedia File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠdisplayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Ġ= Ġcontent Uri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Name Ġ= Ġfolder Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Type Ġ= ĠMediaType . AUDIO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdate Modified . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaud ios ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < Media File >. groupBy Folder () Ġ= Ġgroup By Ġ{ Ġit . folder Name Ġ} ĊĠĠĠ Ġ. entries ĊĠĠĠ Ġ. map Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ ĠMedia File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Ġ= Ġentry . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Name Ġ= Ġentry . key ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . value . first OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġit . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . content Uri Ġ= Ġit . content Uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġit . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . description Ġ= Ġit . description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun ĠCursor . getIndex ( columnName : ĠString ) Ġ= Ġget Column Index OrThrow ( columnName ) Ċ Ċ /** Ċ Ġ* ĠConvenience Ġextension Ġmethod Ġto Ġregister Ġa Ġ[ Content Observer ] Ġgiven Ġa Ġlambda . Ċ Ġ*/ Ċ fun ĠContent Resolver . register Observer ( ĊĠĠĠ Ġuri : ĠUri , Ġobserver : Ġ( self Change : ĠBoolean ) Ġ-> ĠUnit Ċ ): ĠContent Observer Ġ{ ĊĠĠĠ Ġval Ġcontent Observer Ġ= Ġobject Ġ: ĠContent Observer ( Handler ( Looper . get Main Looper ())) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( self Change ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġregister Content Observer ( uri , Ġtrue , Ġcontent Observer ) ĊĠĠĠ Ġreturn Ġcontent Observer Ċ }