package Ġcom . zhihu . mat isse . internal . loader Ċ Ċ import Ġandroid . content . Content U ris Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . database . Matrix Cursor Ċ import Ġandroid . database . Merge Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Media Store Ċ import Ġandroidx . loader . content . Cursor Loader Ċ import Ġcom . zhihu . mat isse . MimeType Ċ import Ġcom . zhihu . mat isse . internal . entity . Album Ċ import Ġcom . zhihu . mat isse . internal . entity . Selection Spec Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠLoad Ġall Ġalbum s Ġ( grouped Ġby Ġbucket _ id ) Ġinto Ġa Ġsingle Ġcursor . Ċ Ġ*/ Ċ class ĠAlbum Loader Ġprivate Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġselection : ĠString , ĊĠĠĠ Ġselection Args : ĠArray < String > Ċ ) Ġ: ĠCursor Loader ( ĊĠĠĠ Ġcontext , ĊĠĠĠ ĠQUERY _ URI , ĊĠĠĠ Ġif Ġ( before Android Ten ()) ĠPRO JECTION Ġelse ĠPRO JECTION _ 2 9 , ĊĠĠĠ Ġselection , ĊĠĠĠ Ġselection Args , ĊĠĠĠ ĠBU CKET _ ORDER _ BY Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġload In Background (): ĠCursor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalbum s Ġ= Ġsuper . load In Background () ĊĠĠĠĠĠĠĠ Ġval Ġall Album Ġ= ĠMatrix Cursor ( COLUMNS ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( before Android Ten ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġall Album Cover Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Album s Ġ= ĠMatrix Cursor ( COLUMNS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( albums Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( albums . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Id Ġ= Ġalbum s . getLong ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( Media Store . Files . File Columns ._ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Id Ġ= Ġalbum s . getLong ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( COLUMN _ BUCKET _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket DisplayName Ġ= Ġalbum s . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( COLUMN _ BUCKET _ DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmimeType Ġ= Ġalbum s . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( Media Store . Media Columns . MIME _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġget Uri ( albums ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġalbum s . getInt ( albums . getColumnIndex ( COLUMN _ COUNT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Album s . add Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket DisplayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count Ġ+= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( albums . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Album Cover Uri Ġ= Ġget Uri ( albums ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Album . add Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . AL BU M _ ID _ ALL , ĠAlbum . AL BU M _ ID _ ALL , ĠAlbum . AL BU M _ NAME _ ALL , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Album Cover Uri ?. toString (), Ġtotal Count . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMerge Cursor ( array Of < Cursor >( all Album , Ġother Album s )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġall Album Cover Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP seudo ĠGROUP ĠBY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Map : ĠMutable Map < Long , ĠLong > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( albums Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( albums . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getLong ( albums . getColumnIndex ( COLUMN _ BUCKET _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġcount Map [ bucket Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Map [ bucket Id ] Ġ= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Album s Ġ= ĠMatrix Cursor ( COLUMNS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( albums Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( albums . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Album Cover Uri Ġ= Ġget Uri ( albums ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdone : ĠMutable Set < Long > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHashSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getLong ( albums . getColumnIndex ( COLUMN _ BUCKET _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( done . contains ( bucket Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Id Ġ= Ġalbum s . getLong ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( Media Store . Files . File Columns ._ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket DisplayName Ġ= Ġalbum s . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( COLUMN _ BUCKET _ DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmimeType Ġ= Ġalbum s . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum s . getColumnIndex ( Media Store . Media Columns . MIME _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġget Uri ( albums ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount Map [ bucket Id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Album s . add Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket DisplayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri . toString (), Ġcount . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone . add ( bucket Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count Ġ+= Ġcount . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( albums . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Album . add Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . AL BU M _ ID _ ALL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlbum . AL BU M _ ID _ ALL , ĠAlbum . AL BU M _ NAME _ ALL , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Album Cover Uri ?. toString (), Ġtotal Count . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMerge Cursor ( array Of < Cursor >( all Album , Ġother Album s )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Content Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġa Ġdirty Ġway Ġto Ġfix Ġloading Ġmultiple Ġtimes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ URI Ġ= Ġ" uri " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLUMN _ COUNT Ġ= Ġ" count " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOLUMN _ BUCKET _ ID Ġ= Ġ" bucket _ id " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOLUMN _ BUCKET _ DISPLAY _ NAME Ġ= Ġ" bucket _ display _ name " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠQUERY _ URI Ġ= ĠMedia Store . Files . getContent Uri (" external ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOL UMNS Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns ._ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ BUCKET _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ BUCKET _ DISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Media Columns . MIME _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ COUNT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPRO JECTION Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns ._ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ BUCKET _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ BUCKET _ DISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Media Columns . MIME _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" COUNT (*) ĠAS Ġ$ COLUMN _ COUNT " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPRO JECTION _ 2 9 Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns ._ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ BUCKET _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLUMN _ BUCKET _ DISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Media Columns . MIME _ TYPE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ=== Ġparams Ġfor Ġshow Single MediaType : Ġfalse Ġ=== ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION Ġ= Ġ(" (" Ġ+ ĠMedia Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠOR Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠMedia Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ" =? )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . SIZE Ġ+ Ġ"> 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ") ĠGROUP ĠBY Ġ( bucket _ id ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION _ 2 9 Ġ= Ġ(" (" Ġ+ ĠMedia Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠOR Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠMedia Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ" =? )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . SIZE Ġ+ Ġ"> 0 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSE LECTION _ ARGS Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns . MEDIA _ TYPE _ IMAGE . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns . MEDIA _ TYPE _ VIDEO . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ================================= ============ ĊĠĠĠĠĠĠĠ Ġ// Ġ=== Ġparams Ġfor Ġshow Single MediaType : Ġtrue Ġ=== ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ TYPE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Media Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . SIZE Ġ+ Ġ"> 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ") ĠGROUP ĠBY Ġ( bucket _ id ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ TYPE _ 2 9 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Media Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . SIZE Ġ+ Ġ"> 0 ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ=== Ġparams Ġfor Ġshow Single MediaType : Ġtrue Ġ=== ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ G IF _ TYPE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Media Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . SIZE Ġ+ Ġ"> 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . MIME _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ") ĠGROUP ĠBY Ġ( bucket _ id ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ================================= ============ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ G IF _ TYPE _ 2 9 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Media Store . Files . File Columns . MEDIA _ TYPE Ġ+ Ġ"= ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . SIZE Ġ+ Ġ"> 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠAND Ġ" Ġ+ ĠMedia Store . Media Columns . MIME _ TYPE Ġ+ Ġ" =? ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBU CKET _ ORDER _ BY Ġ= ĠMedia Store . Images . Media . DATE _ MODI FIED Ġ+ Ġ" ĠDESC " ĊĊĠĠĠĠĠĠĠ Ġ// Ġ================================= ============ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Selection Args For Single MediaType ( media Type : ĠInt ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( media Type . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Selection Args For Single Media Gif Type ( media Type : ĠInt ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( media Type . toString (), ĠMime Type . G IF . mime TypeName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( context : ĠContext ): ĠCursor Loader Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Args : ĠArray < String > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Spec . only Show Gif Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġif Ġ( before Android Ten ()) ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ G IF _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ G IF _ TYPE _ 2 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args Ġ= Ġget Selection Args For Single Media Gif Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns . MEDIA _ TYPE _ IMAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Spec . only Show Images Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġif Ġ( before Android Ten ()) ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ TYPE _ 2 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args Ġ= Ġget Selection Args For Single MediaType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns . MEDIA _ TYPE _ IMAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Spec . only Show Videos Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġif Ġ( before Android Ten ()) ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSE LECTION _ FOR _ SINGLE _ MEDIA _ TYPE _ 2 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args Ġ= Ġget Selection Args For Single MediaType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . File Columns . MEDIA _ TYPE _ VIDEO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġif Ġ( before Android Ten ()) ĠSE LECTION Ġelse ĠSE LECTION _ 2 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args Ġ= ĠSE LECTION _ ARGS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAlbum Loader ( context , Ġselection , Ġselection Args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Uri ( cursor : ĠCursor ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( Media Store . Files . File Columns ._ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmimeType Ġ= Ġcursor . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex ( Media Store . Media Columns . MIME _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Uri : ĠUri Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMime Type . is Image ( mime Type ) Ġ-> ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMime Type . is Video ( mime Type ) Ġ-> ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMedia Store . Files . getContent Uri (" external ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠContent U ris . with App ended Id ( content Uri , Ġid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbefore Android Ten (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . Q ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }