package Ġcom . example . med itation app . viewModel Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . example . med itation app . Application Ċ import Ġcom . example . med itation app . Event Ċ import Ġcom . example . med itation app . R Ċ import Ġcom . example . med itation app . enum . Music Enum Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule At Fixed Rate Ċ Ċ class ĠTop ViewModel : ĠViewModel () Ġ{ ĊĊĠĠĠ Ġvar Ġmedia Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmusic Ġ= ĠR . raw . aur ora ĊĠĠĠ Ġ// éŁ³ æ¥ ½ åĨį çĶŁ ãĥĿ ãĤ¸ ãĤ·ãĥ§ãĥ³ ĊĠĠĠ Ġvar Ġmedia Player Position Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtimer Ġ= ĠTimer () ĊĠĠĠ Ġprivate Ġval Ġtimer Task : ĠTimer Task . () Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ time . value Ġ= Ġtime . value ?. plus ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdrawable Id Ġ= ĠMutable LiveData ( R . drawable . aur ora ) ĊĠĠĠ Ġval Ġis Play Ġ= ĠMutable LiveData ( true ) ĊĠĠĠ Ġprivate Ġval Ġ_ transit To Create Ġ= ĠMutable LiveData < Event < String >>() ĊĠĠĠ Ġval Ġtransit To Create : ĠLive Data < Event < String >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ transit To Create ĊĊĠĠĠ Ġprivate Ġval Ġ_ time Ġ= ĠMutable LiveData ( 0 ) ĊĠĠĠ Ġprivate Ġval Ġtime : ĠLive Data < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ time ĊĊĠĠĠ Ġval Ġtimer Text : ĠLive Data < String > Ġ= ĠTransform ations . map ( time ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġit Ġ/ Ġ 3 6 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġ( it Ġ% Ġ 3 6 0 0 0 ) Ġ/ Ġ 6 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġ(( it Ġ% Ġ 3 6 0 0 0 ) Ġ% Ġ 6 0 0 ) Ġ/ Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġ"% 0 2 d :% 0 2 d :% 0 2 d ". format ( hour , Ġminute , Ġsecond ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclick History (){ ĊĠĠĠĠĠĠĠ Ġ_ transit To Create . value Ġ= ĠEvent ( Application . instance . getString ( R . string . transit _ flag _ to _ list )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclick Play ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġwhen ( is Play . value ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ Ġ// Ġnot Ġplaying ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Play . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( media Player Position ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ Ġ// åĨį çĶŁ ä½įç½® 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate MediaPlayer ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ// åĨį çĶŁ éĢ Ķ ä¸Ń ãģ§ ãĥĿ ãĥ¼ãĤ º çĬ¶æħĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. seek To ( media Player Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ Ġ// playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Play . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Position Ġ= Ġmedia Player ?. current Position Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow History Create Dialog ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclick Music ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( Application . instance . getString ( R . string . select _ music _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( Music Enum . getValues (), ĠMusic Enum . from Drawable Id ( drawable Id . value !! ). ordinal ){ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Id . value Ġ= ĠMusic Enum . values ()[ which ]. drawable Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic Ġ= ĠMusic Enum . values ()[ which ]. raw Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// MediaPlayer ãĤĴ ãĥª ãĤ»ãĥĥãĥĪ ãģĹ ãĢģ åĨį çĶŁ ä½įç½® ãĤĴ 0 ãģ« æĪ » ãģĻ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( is Play . value !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġcreate MediaPlayer ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate MediaPlayer ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( Application . instance . getString ( R . string . select _ music _ cancel )) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġtimer . schedule At Fixed Rate ( 0 , Ġ 1 0 0 , Ġtimer Task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ time . value Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate MediaPlayer ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġmedia Player Ġ= ĠMedia Player . create ( context , Ġmusic ) ĊĠĠĠĠĠĠĠ Ġmedia Player !!. is Loop ing Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ ä»Ĭ åĽŀ ãģ® å± ¥ æŃ ´ ãĤĴ æ® ĭ ãģĻ ãģĭ ãģ® Dialog Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow History Create Dialog ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( Application . instance . getString ( R . string . history _ create _ dialog _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( Application . instance . getString ( R . string . history _ create _ dialog _ yes )){ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ãĤ¯ãĥªãĥĥãĤ¯ ãĤ¤ ãĥĻ ãĥ³ãĥĪ ãĤĴ Fragment ãģ« æ¸ ¡ ãģĻ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ transit To Create . value Ġ= ĠEvent ( Application . instance . getString ( R . string . transit _ flag _ to _ create )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( Application . instance . getString ( R . string . history _ create _ dialog _ no )){ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} Ċ }