package Ġir . me h di y ari . f allery . repo Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . media . Media Metadata Retriever Ċ import Ġandroid . provider . Media Store Ċ import Ġir . me h di y ari . f allery . image Loader . Photo Dim in ution Ċ import Ġir . me h di y ari . f allery . models . Bucket Type Ċ import Ġir . me h di y ari . f allery . models . Cache Dir Ċ import Ġir . me h di y ari . f allery . models . Media Ċ import Ġir . me h di y ari . f allery . utils .* Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlin . random . Random Ċ Ċ internal Ġclass ĠBucket Content Provider Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcontent Resolver : ĠContent Resolver , ĊĠĠĠ Ġprivate Ġval Ġcache Dir : ĠCache Dir Ċ ) Ġ: ĠAbstract Bucket Content Provider Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Med ias Of Bucket ( bucket Id : ĠLong , Ġbucket Type : ĠBucket Type ): ĠFlow < List < Media >> Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedi as Ġ= Ġmutable ListOf < Media >() ĊĠĠĠĠĠĠĠ Ġval Ġmedia Metadata Retriever Ġ= ĠMedia Metadata Retriever () ĊĠĠĠĠĠĠĠ Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Files . getContent Uri (" external "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġphoto With Video Projection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ getSimple Query By MediaType ( bucket Type )} Ġ${ if Ġ( bucket Id Ġ== ĠALL _ MEDIA _ MODEL _ ID ) Ġ"" Ġelse Ġ" AND Ġbucket _ id =? "} ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Query Args For Get Content Buckets ( bucket Type , Ġbucket Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Media Store . Files . File Columns . DATE _ AD DED } ĠDESC " ĊĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( listOf < Media >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedi as . add ( get Media From Cursor ( cursor , Ġmedia Metadata Retriever )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġemit Ġmedi as Ġas Ġchunks Ġwith Ġsize Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( medi as . size Ġ>= Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( medi as . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedi as . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( medi as . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedi as . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Media From Cursor ( ĊĠĠĠĠĠĠĠ Ġcursor : ĠCursor , ĊĠĠĠĠĠĠĠ Ġmedia Metadata Retriever : ĠMedia Metadata Retriever ĊĠĠĠ Ġ): ĠMedia Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Photo Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( photo With Video Projection [ 4 ])) Ġ== ĠMedia Store . Files . File Columns . MEDIA _ TYPE _ IMAGE ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcursor . getString ( cursor . getColumnIndex OrThrow ( photo With Video Projection [ 1 ])) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Photo ) Ġmedia Metadata Retriever . set DataSource ( path ) ĊĊĠĠĠĠĠĠĠ Ġval Ġthumbnail Ġ= Ġif Ġ(! is Photo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Thumb For Videos OrEmpty ( listOf ( Pair ( path , Ġcursor . getLong ( cursor . getColumnIndex ( photo With Video Projection [ 5 ]))) ), Ġcache Dir . cacheDir ). first OrNull () ĊĠĠĠĠĠĠĠ Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( photo With Video Projection [ 0 ])) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Photo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Photo Dimension ( path ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia . Photo ( id , Ġpath , Ġit . width , Ġit . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthumbnail Dim in ution Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Photo Dimension ( thumbnail Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPhoto Dim in ution ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia . Video ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid , Ġpath , Ġ(( media Metadata Retriever . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ DURATION )?. to Long OrNull () Ġ?: Ġ 1 0 0 0 L ) Ġ/ Ġ 1 0 0 0 ), ĠMedia . Photo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRandom . next Long (), Ġthumbnail Ġ?: Ġ"", Ġthumbnail Dim in ution . width , Ġthumbnail Dim in ution . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Simple Query By MediaType ( media Type : ĠBucket Type ): ĠString Ġ= Ġwhen Ġ( media Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBucket Type . VIDEO _ PH OTO _ BUCKET S Ġ-> Ġ" (${ Media Store . Files . File Columns . MEDIA _ TYPE } =? ĠOR Ġ${ Media Store . Files . File Columns . MEDIA _ TYPE } =? )" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"${ Media Store . Files . File Columns . MEDIA _ TYPE }= ?" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Query Args For Get Content Buckets ( bucket Type : ĠBucket Type , Ġbucket Id : ĠLong ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarrays Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġarrays . addAll ( getQuery Arg By MediaType ( bucket Type )) ĊĠĠĠĠĠĠĠ Ġif Ġ( bucket Id Ġ!= ĠALL _ MEDIA _ MODEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarrays . add ( bucket Id . toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġarrays . to Typed Array () ĊĠĠĠ Ġ} Ċ }