package Ġcom . br anh amp layer . android . ser mon s . services . media Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . Media Metadata Retriever Ċ import Ġandroid . support . v 4 . media . Media Browser Compat . Media Item Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġcom . br anh amp layer . android . ser mon s . map pers . Drawer Mapper Ċ import Ġcom . br anh amp layer . android . ser mon s . models . Drawer Item Model Ċ import Ġcom . br anh amp layer . android . ser mon s . repositories . Ser mon List Repository Ċ import Ġcom . br anh amp layer . android . utils . logging . Log gly Ċ import Ġcom . br anh amp layer . android . utils . logging . Log gly Constants . Tags . SER MON _ LIBRARY Ċ import Ġjava . util . Stack Ċ Ċ class ĠLibrary ( ĊĠĠĠ Ġcontext : ĠContext ?, ĊĠĠĠ Ġrepository : ĠSer mon List Repository Ġ= ĠSer mon List Repository (), ĊĠĠĠ Ġdrawer List Mapper : ĠDraw er Mapper Ġ= ĠDraw er Mapper ( context ) Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Ser mon : ĠDraw er Item Model ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Ser mon Index : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġroot Ser mon : ĠDraw er Item Model ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġser mon s On Disk Ġ= Ġrepository . get Ser mon s (). value ĊĠĠĠĠĠĠĠ Ġroot Ser mon Ġ= Ġdrawer List Mapper . map ( ser mon s On Disk ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠB rowsing ĊĊĠĠĠ Ġfun Ġbuild Media Browser Menu ( parentId : ĠString ) Ġ= Ġfind Children By Parent Id ( parentId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . type Ġ== ĠDraw er Item Model . Drawer ItemType . FOLDER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . to Browsable Media Item () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . to Play able Media Item () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. to Mutable List () Ġ?: Ġmutable ListOf () ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠPlayer ĠNavigation ĊĊĠĠĠ Ġval Ġcurrent OrNull : ĠMedia Metadata Compat ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Ser mon ?. to Play able Metadata () ĊĊĠĠĠ Ġval Ġnext : ĠMedia Metadata Compat ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ser mon ?. parent Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ current Ser mon Index ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ser mon Index Ġ== Ġcurrent Ser mon ?. parent ?. children ?. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ser mon Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ser mon Ġ= Ġcurrent Ser mon ?. parent ?. children ?. get ( current Ser mon Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Ser mon ?. to Play able Metadata () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġprevious : ĠMedia Metadata Compat ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ser mon ?. parent Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-- current Ser mon Index ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ser mon Index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ser mon Index Ġ= Ġcurrent Ser mon ?. parent ?. children ?. size ?. minus ( 1 ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ser mon Ġ= Ġcurrent Ser mon ?. parent ?. children ?. get ( current Ser mon Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Ser mon ?. to Play able Metadata () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetCurrent By Media Id ( media Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Ser mon Ġ= Ġfind Ser mon In Tree By Media Id ( media Id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Ser mon Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcurrent Ser mon Index Ġ= Ġget IndexOf Current Ser mon () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠPrivate ĠMethods ĊĊĠĠĠ Ġprivate Ġfun Ġfind Children By Parent Id ( parentId : ĠString ): ĠMutable List < Drawer Item Model >? Ġ{ Ġ// ĠDFS ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < Drawer Item Model >() ĊĠĠĠĠĠĠĠ Ġstack . push ( root Ser mon ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Item : ĠDraw er Item Model ? ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! stack . empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Item Ġ= Ġstack . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentItem ?. id Ġ== ĠparentId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Item . children ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Item . children . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Ser mon In Tree By Media Id ( media Id : ĠString ?): ĠDraw er Item Model ? Ġ{ Ġ// ĠDFS ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < Drawer Item Model >() ĊĠĠĠĠĠĠĠ Ġstack . push ( root Ser mon ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Item : ĠDraw er Item Model ? ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! stack . empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Item Ġ= Ġstack . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentItem ?. id Ġ== Ġmedia Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Item . children . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget IndexOf Current Ser mon (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Ser mon ?. parent ?. children ?. forEach Indexed Ġ{ Ġindex , Ġser mon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ser mon . id Ġ== Ġcurrent Ser mon ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠExtension ĠFunctions ĊĊĠĠĠ Ġprivate Ġfun ĠDraw er Item Model . to Browsable Media Item (): ĠMedia Item Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġser mon Metadata Ġ= ĠMedia Metadata Compat . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ AR TI ST , Ġsubtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ MEDIA _ ID , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ TITLE , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMedia Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġser mon Metadata . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item . FLAG _ BRO WS ABLE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDraw er Item Model . to Play able Media Item () Ġ= ĠMedia Item ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Play able Metadata (). description , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item . FLAG _ PLAY ABLE ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun ĠDraw er Item Model . to Play able Metadata (): ĠMedia Metadata Compat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaudio File Metadata Ġ= ĠMedia Metadata Retriever () ĊĠĠĠĠĠĠĠ Ġvar Ġduration In Ms Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġid ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio File Metadata . set DataSource ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration In Ms Ġ= Ġaudio File Metadata . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ DURATION ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog gly . d ( SER MON _ LIBRARY , Ġ" Found Ġduration Ġof Ġser mon : Ġ$ filePath , Ġduration : Ġ$ duration In Ms ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog gly . e ( SER MON _ LIBRARY , Ġe , Ġ" Could Ġnot Ġdetermine Ġthe Ġduration Ġof Ġ$ filePath ") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio File Metadata . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMedia Metadata Compat . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ AR TI ST , Ġsubtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ MEDIA _ ID , ĠfilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ TITLE , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Long ( Media Metadata Compat . METADATA _ KEY _ DURATION , Ġduration In Ms . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region Ċ } Ċ