/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . ĠCar los ĠRen Ã© ĠR amos ĠL Ã³ pe z . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . c rr l . beat player . repository Ċ Ċ import Ġandroid . content .* Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . os . Remote Exception Ċ import Ġandroid . provider . Base Columns ._ ID Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . provider . Media Store . Audio . Play lists . EXTERNAL _ CONTENT _ URI Ċ import Ġandroid . provider . Media Store . Audio . Play lists . Members . AUDIO _ ID Ċ import Ġandroid . provider . Media Store . Audio . Play lists . Members . PLAY _ ORDER Ċ import Ġandroid . provider . Media Store . Audio . Play lists Columns . NAME Ċ import Ġandroid . util . Log Ċ import Ġcom . c rr l . beat player . extensions . toList Ċ import Ġcom . c rr l . beat player . models . Playlist Ċ import Ġcom . c rr l . beat player . models . Song Ċ import Ġcom . c rr l . beat player . utils . Settings Utility Ċ Ċ interface ĠPlaylist Repository Interface Ġ{ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġcreate Playlist ( name : ĠString ?): ĠLong ĊĊĠĠĠ Ġfun Ġget Play Lists (): ĠList < Playlist > ĊĠĠĠ Ġfun ĠgetS ongs In Playlist ( playlist Id : ĠLong ): ĠList < Song > ĊĠĠĠ Ġfun Ġremove From Playlist ( playlist Id : ĠLong , Ġid : ĠLong ) ĊĠĠĠ Ġfun Ġdelete Playlist ( playlist Id : ĠLong ): ĠInt Ċ } Ċ Ċ class ĠPlaylist Repository () Ġ: ĠPlaylist Repository Interface Ġ{ ĊĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontent Resolver : ĠContent Resolver ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsettings Utility : ĠSettings Utility ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠPlaylist Repository ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( context : ĠContext ?): ĠPlaylist Repository ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= ĠPlaylist Repository ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent Resolver Ġ= Ġcontext !!. content Resolver ĊĠĠĠĠĠĠĠ Ġsettings Utility Ġ= ĠSettings Utility . getInstance ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Playlist ( name : ĠString ?): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= Ġ"$ NAME Ġ= Ġ? " ĊĠĠĠĠĠĠĠ Ġval Ġselection Args Ġ= ĠarrayOf ( name ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEXTER NAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( it . count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values ( 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( NAME , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . insert ( EXTERNAL _ CONTENT _ URI , Ġvalues )?. last Path Segment ?. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Unable Ġto Ġquery Ġ$ EXTERNAL _ CONTENT _ URI , Ġbecause Ġsystem Ġreturned Ġnull .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Play Lists (): ĠList < Playlist > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmake Playlist Cursor (). toList ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġ= Ġget Long ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsong Count Ġ= Ġget Song Count For Playlist ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlaylist . from Cursor ( this , Ġsong Count ) ĊĠĠĠĠĠĠĠ Ġ}. filter Ġ{ Ġit . name . isNotEmpty () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠaddTo Playlist ( playlist Id : ĠLong , Ġids : ĠLong Array ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf (" max ($ PLAY _ ORDER )") ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMedia Store . Audio . Play lists . Members . getContent Uri (" external ", Ġplaylist Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbase : ĠInt Ġ= Ġcontent Resolver . query ( uri , Ġprojection , Ġnull , Ġnull , Ġnull )?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getInt ( 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIllegalStateException (" Unable Ġto Ġquery Ġ$ uri , Ġsystem Ġreturned Ġnull .") ĊĊĠĠĠĠĠĠĠ Ġvar Ġnum Inserted Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( offset Ġ< Ġids . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbulk Values Ġ= Ġmake Insert Items ( ids , Ġoffset , Ġ 1 0 0 0 , Ġbase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Inserted Ġ+= Ġcontent Resolver . bulk Insert ( uri , Ġbulk Values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnum Inserted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetS ongs In Playlist ( playlist Id : ĠLong ): ĠList < Song > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplaylist Count Ġ= Ġcount Playlist ( playlist Id ) ĊĊĠĠĠĠĠĠĠ Ġmake Playlist Song Cursor ( playlist Id )?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrun Cleanup Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . count Ġ!= Ġplaylist Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Cleanup Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! run Cleanup Ġ&& Ġit . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplay Order Col Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getColumnIndex OrThrow ( PLAY _ ORDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Play Order Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplay Order Ġ= Ġit . getInt ( play Order Col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( play Order Ġ== Ġlast Play Order ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Cleanup Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Play Order Ġ= Ġplay Order ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( it . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( run Cleanup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Playlist ( playlist Id , Ġit , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmake Playlist Song Cursor ( playlist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList ( true , ĠSong . Companion :: createFrom Playlist Cursor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove From Playlist ( playlist Id : ĠLong , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMedia Store . Audio . Play lists . Members . getContent Uri (" external ", Ġplaylist Id ) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . delete ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ _ ID Ġ= Ġ?", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( id . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Playlist ( playlist Id : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Uri Ġ= ĠEXTER NAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġval Ġlocal StringBuilder Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("_ id ĠIN Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( playlist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . delete ( local Uri , Ġlocal StringBuilder . toString (), Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Playlist Cursor (): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEXTER NAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (_ ID , ĠNAME ), Ġnull , Ġnull , ĠMedia Store . Audio . Play lists . DEFAULT _ SORT _ ORDER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( Log . ERROR , Ġ" Exception ", Ġex . message !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Song Count For Playlist ( playlist Id : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMedia Store . Audio . Play lists . Members . getContent Uri (" external ", Ġplaylist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (_ ID ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Media Store . Audio . Audio Columns . TITLE } Ġ!= Ġ'' ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( Log . ERROR , Ġ" Exception ", Ġex . message !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcleanup Playlist ( ĊĠĠĠĠĠĠĠ Ġplaylist Id : ĠLong , ĊĠĠĠĠĠĠĠ Ġcursor : ĠCursor , ĊĠĠĠĠĠĠĠ Ġclose Cursor After : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Col Ġ= Ġcursor . getColumnIndex OrThrow ( AUDIO _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMedia Store . Audio . Play lists . Members . getContent Uri (" external ", Ġplaylist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġops Ġ= Ġarray ListOf < Content Provider Operation >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Content Provider Operation . new Delete ( uri ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First () Ġ&& Ġcursor . count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠContent Provider Operation . new Insert ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( PLAY _ ORDER , Ġcursor . position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( AUDIO _ ID , Ġcursor . getLong ( id Col )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( cursor . position Ġ+ Ġ 1 ) Ġ% Ġ 1 0 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . with Yield Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops . add ( builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . apply Batch ( Media Store . AUTH ORITY , Ġops ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRemoteException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠOperation ApplicationException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( close Cursor After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Playlist ( playlist Id : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Play lists . Members . getContent Uri (" external ", Ġplaylist Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( AUDIO _ ID ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Play lists . Members . DEFAULT _ SORT _ ORDER ĊĠĠĠĠĠĠĠ Ġ) ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Playlist Song Cursor ( playlist ID : ĠLong ?): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("${ Media Store . Audio . Audio Columns . TITLE } Ġ!= Ġ'' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" play _ order ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" title ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" artist ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" album ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" duration ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" track ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" artist _ id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" album _ id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ data " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Play lists . Members . getContent Uri (" external ", Ġplaylist ID !! ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Play lists . Members . DEFAULT _ SORT _ ORDER ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Insert Items ( ĊĠĠĠĠĠĠĠ Ġids : ĠLong Array , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠ Ġlen : ĠInt , ĊĠĠĠĠĠĠĠ Ġbase : ĠInt ĊĠĠĠ Ġ): ĠArray < Content Values > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġactual Len Ġ= Ġlen ĊĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ+ Ġactual Len Ġ> Ġids . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Len Ġ= Ġids . size Ġ- Ġoffset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontent Values List Ġ= Ġmutable ListOf < Content Values >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġactual Len ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( PLAY _ ORDER , Ġbase Ġ+ Ġoffset Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( AUDIO _ ID , Ġids [ offset Ġ+ Ġi ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values List . add ( values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Values List . to Typed Array () ĊĠĠĠ Ġ} Ċ }