package Ġcom . simple mobile tools . music player . helpers Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . provider . Media Store Ċ import Ġcom . simple mobile tools . commons . extensions .* Ċ import Ġcom . simple mobile tools . music player . extensions . config Ċ import Ġcom . simple mobile tools . music player . extensions . songs DAO Ċ import Ġcom . simple mobile tools . music player . models . Song Ċ Ċ class ĠRoom Helper ( val Ġcontext : ĠContext ) Ġ{ ĊĠĠĠ Ġfun Ġadd Song To Playlist ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd S ongsTo Playlist ( array ListOf ( path )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd S ongsTo Playlist ( paths : ĠArrayList < String >, Ġplaylist Id : ĠInt Ġ= Ġcontext . config . current Playlist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsongs Ġ= ĠgetS ongs From Paths ( paths , Ġplaylist Id ) ĊĠĠĠĠĠĠĠ Ġcontext . songs DAO . insert All ( songs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Song From Path ( path : ĠString ): ĠSong ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsongs Ġ= ĠgetS ongs From Paths ( array ListOf ( path ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsongs . first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetS ongs From Paths ( paths : ĠList < String >, Ġplaylist Id : ĠInt ): ĠArrayList < Song > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMedia Store . Audio . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= ĠarrayOf ( Media Store . Audio . Media ._ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DATA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DURATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AL BU M ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpaths Map Ġ= ĠHashSet < String >() ĊĠĠĠĠĠĠĠ Ġpaths . map To ( paths Map ) Ġ{ Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠITE MS _ PER _ GROUP Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġval Ġsongs Ġ= ĠArrayList < Song >( paths . size ) ĊĠĠĠĠĠĠĠ Ġval Ġshow Filename Ġ= Ġcontext . config . show Filename ĊĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġpaths . size Ġ/ ĠITE MS _ PER _ GROUP ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. parts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub list Ġ= Ġpaths . sub List ( i Ġ* ĠITE MS _ PER _ GROUP , ĠMath . min (( i Ġ+ Ġ 1 ) Ġ* ĠITE MS _ PER _ GROUP , Ġpaths . size )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquestion Marks Ġ= Ġget Question Marks ( sub list . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Ġ= Ġ"${ Media Store . Audio . Media . DATA } ĠIN Ġ($ question Marks )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Args Ġ= Ġsub list . to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcontext . content Resolver . query ( uri , Ġcolumns , Ġselection , Ġselection Args , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor ?. moveTo First () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Store Id Ġ= Ġcursor . getLong Value ( Media Store . Audio . Media ._ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġcursor . getString Value ( Media Store . Audio . Media . TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= Ġcursor . getString Value ( Media Store . Audio . Media . AR TI ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcursor . getString Value ( Media Store . Audio . Media . DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġcursor . getInt Value ( Media Store . Audio . Media . DURATION ) Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Ġ= Ġcursor . getString Value ( Media Store . Audio . Media . AL BU M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Title Ġ= Ġget Song Title ( title , Ġshow Filename , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsong Ġ= ĠSong ( media Store Id , Ġnew Title , Ġartist , Ġpath , Ġduration , Ġalbum , Ġplaylist Id , ĠTYPE _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsongs . add ( song ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths Map . remove ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpaths Map . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunknown Ġ= ĠMedia Store . UNKNOWN _ STRING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġit . getFile Song Title () Ġ?: Ġunknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsong Ġ= ĠSong ( 0 , Ġget Song Title ( title , Ġshow Filename , Ġit ), Ġit . getFile Artist () Ġ?: Ġunknown , Ġit , Ġit . getFile Duration Seconds () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 , Ġ"", Ġplaylist Id , ĠTYPE _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsongs . add ( song ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsongs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Question Marks ( cnt : ĠInt ) Ġ= Ġ" ?" Ġ+ Ġ", ? ". repeat ( Math . max ( cnt Ġ- Ġ 1 , Ġ 0 )) ĊĊĠĠĠ Ġprivate Ġfun Ġget Song Title ( title : ĠString , Ġshow Filename : ĠInt , Ġpath : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( show Filename ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSHOW _ FILENAME _ NE VER Ġ-> Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSHOW _ FILENAME _ IF _ UN AVAILABLE Ġ-> Ġif Ġ( title Ġ== ĠMedia Store . UNKNOWN _ STRING ) Ġpath . get Filename From Path () Ġelse Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpath . get Filename From Path () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ