package Ġcn . edu . nc u . music player Ċ Ċ import Ġandroid . content . res . Asset Manager Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . media . Media Metadata Retriever Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcn . edu . nc u . music player . data . Music Ċ Ċ class ĠMain ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġmus ics : ĠLive Data < List < Music >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ mus ics ĊĊĠĠĠ Ġval Ġplay Music : ĠLive Data < Music > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ play Music ĊĊĠĠĠ Ġval Ġplay : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ play ĊĊĠĠĠ Ġ/* val Ġfav : ĠLive Data < Boolean > ĊĠĠĠ Ġget () Ġ= Ġ*/ ĊĊĠĠĠ Ġval Ġline Sequence : ĠLive Data < Line Sequence > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ line Sequence ĊĊĠĠĠ Ġprivate Ġval Ġ_ music List Ġ= ĠArrayList < Music >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ play Music : ĠMutable LiveData < Music > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġval Ġ_ mus ics : ĠMutable LiveData < List < Music >> Ġ= ĠMutable LiveData (_ music List ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ play : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ line Sequence : ĠMutable LiveData < Line Sequence > Ġ= ĠMutable LiveData ( Line Sequence . ORDER ) ĊĊĠĠĠ Ġfun Ġload M us ics ( asset Manager : ĠAsset Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmusic Names Ġ= Ġasset Manager . list (" mus ics ") ĊĠĠĠĠĠĠĠ ĠLog . d ( this :: class . simple Name , Ġmusic Names . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( music Names Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm mr Ġ= ĠMedia Metadata Retriever () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( music Name Ġin Ġmusic Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( this :: class . simple Name , Ġmusic Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġasset Manager . open Fd (" mus ics /$ music Name ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm mr . set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfd . file Descriptor , Ġfd . start Offset , Ġfd . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġm mr . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Ġ= Ġm mr . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ AL BU M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmime Ġ= Ġm mr . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ MIME TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= Ġm mr . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ AR TI ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġm mr . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ DATE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbits Ġ= Ġm mr . embedded Picture ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Bit Map Ġ= ĠBitmap Factory . decode ByteArray ( bits , Ġ 0 , Ġbits . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ music List . add ( Music ( title , Ġalbum , Ġmime , Ġartist , Ġdate , Ġimg Bit Map )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( this :: class . simple Name , Ġe . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Music ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ play Music . value Ġ= Ġ_ music List [ position ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay And Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ play . value Ġ= Ġ!_ play . value !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Line Sequence () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ(_ line Sequence . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLine Sequence . ORDER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ line Sequence . value Ġ= ĠLine Sequence . SH UFF LE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLine Sequence . SH UFF LE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ line Sequence . value Ġ= ĠLine Sequence . REPEAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLine Sequence . REPEAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ line Sequence . value Ġ= ĠLine Sequence . ORDER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }