package Ġcom . example . medi ap layer . data . que ires Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Content U ris Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Base Columns Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . provider . Media Store . Audio . Gen res .* Ċ import Ġandroidx . core . database . getString OrNull Ċ import Ġcom . example . medi ap layer . model . Artist Model Ċ import Ġcom . example . medi ap layer . model . Genre Model Ċ import Ġcom . example . medi ap layer . model . Song Model ĊĊ Ċ class ĠGen re ( private Ġval Ġapplication : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontent Resolver Ġ= Ġapplication . content Resolver ĊĊĊĠĠĠ Ġ// Ġquery Ġfailed , Ġhandle Ġerror . ĊĠĠĠ Ġ// Ġno Ġmedia Ġon Ġthe Ġdevice ĊĠĠĠ Ġfun ĠgetAll (): ĠList < Genre Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf (_ ID , ĠNAME ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( EXTERNAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgen res : ĠMutable List < Genre Model > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull Ġ|| Ġ! cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgen res ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenre Id Column Ġ= Ġget Column Index ( Base Columns ._ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenre Name Column Ġ= Ġget Column Index ( Media Store . Audio . Gen res Columns . NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠgetString OrNull ( genre Name Column )?. capitalize () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġget Long ( genre Id Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen res . add ( Genre Model ( id , Ġname , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgen res . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . with S ongs ( genre Count ( it . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenre Count ( genre Id : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( Members ._ ID , ĠMembers . AUDIO _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( Members . getContent Uri (" external ", Ġgenre Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , Ġ"${ Media Store . Audio . Media . IS _ M US IC } != Ġ 0 ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull Ġ|| Ġ! cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Related Artist ( id : ĠLong ): ĠList < Artist Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AR TI ST _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . AL BU M _ AR TI ST ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( Members . getContent Uri (" external ", Ġid ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , Ġ"${ Media Store . Audio . Media . IS _ M US IC } != Ġ 0 ", Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġartists : ĠMutable List < Artist Model > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull Ġ|| Ġ! cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġartists ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Column Ġ= Ġget Column Index ( Media Store . Audio . Media . AR TI ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Id Column Ġ= Ġget Column Index ( Media Store . Audio . Audio Columns . AR TI ST _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Artist Column Ġ= Ġget Column Index ( Columns . AL BU M _ AR TI ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= ĠgetString ( artist Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Id Ġ= Ġget Long ( artist Id Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Artist Ġ= ĠgetString OrNull ( album Artist Column ) Ġ?: Ġartist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartists . add ( Artist Model ( artist Id , Ġartist , Ġalbum Artist , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġartists . groupBy Ġ{ Ġit . id Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= Ġit . value [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . with S ongs ( it . value . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" In lined Api ") ĊĠĠĠ Ġfun ĠgetList S ongs ( id : ĠLong ): ĠList < Song Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( Media Store . Audio . Media ._ ID , ĠMedia Store . Audio . Media . AR TI ST _ ID , ĠMedia Store . Audio . Media . AL BU M _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . AL BU M , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . AL BU M _ AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DURATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DATA , ĠMedia Store . Audio . Media . YEAR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . TRACK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DATE _ AD DED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Audio . Media . DATE _ MODI FIED ) ĊĠĠĠĠĠĠĠ Ġval Ġart Work Uri Ġ= ĠUri . parse (" content :// media / external / audio / album art ") ĊĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( Members . getContent Uri (" external ", Ġid ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , Ġ"${ Media Store . Audio . Media . IS _ M US IC } != Ġ 0 Ġ", Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġplay Lists : ĠMutable List < Song Model > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull Ġ|| Ġ! cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġplay Lists ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Id Columns Ġ= Ġget Column Index ( Media Store . Audio . Media . AL BU M _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Id Column Ġ= Ġget Column Index ( Media Store . Audio . Media ._ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Column Ġ= Ġget Column Index ( Media Store . Audio . Media . TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Column Ġ= Ġget Column Index ( Media Store . Audio . Media . AR TI ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Id Column Ġ= Ġget Column Index ( Media Store . Audio . Audio Columns . AR TI ST _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Column Ġ= Ġget Column Index ( Media Store . Audio . Audio Columns . AL BU M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Artist Column Ġ= Ġget Column Index ( Columns . AL BU M _ AR TI ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Column Ġ= Ġget Column Index ( Media Store . Audio . Media . DURATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Added Column Ġ= Ġget Column Index ( Media Store . Audio . Media . DATE _ AD DED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Column Ġ= Ġget Column Index ( Media Store . Audio . Media . DATE _ MODI FIED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsong Id Ġ= Ġget Long ( audio Id Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= ĠgetString ( title Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= ĠgetString ( artist Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Id Ġ= Ġget Long ( album Id Columns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Id Ġ= Ġget Long ( artist Id Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Ġ= ĠgetString ( album Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Artist Ġ= ĠgetString OrNull ( album Artist Column ) Ġ?: Ġartist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġget Long ( duration Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Added Ġ= Ġget Long ( date Added Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Modified Ġ= Ġget Long ( date Modified Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Uri Ġ= ĠContent U ris . with App ended Id ( Media Store . Audio . Media . EXTERNAL _ CONTENT _ URI , Ġsong Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= ĠContent U ris . with App ended Id ( art Work Uri , Ġalbum Id ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Lists . add ( Song Model ( song Id , Ġtitle , Ġartist , Ġaudio Uri , Ġimage Uri , Ġduration , Ġalbum Id , Ġartist Id , Ġalbum , Ġalbum Artist , Ġdate Added , Ġdate Modified )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġplay Lists ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }