package Ġcom . imag inary rh om bus . pro ct imer . ui . timer Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġcom . imag inary rh om bus . pro ct imer . R Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . ceil Ċ import Ġkotlin . math . max Ċ import Ġorg . k oin . core . K oin Component Ċ import Ġorg . k oin . core . get Ċ Ċ /** Ċ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ çĶ¨ ãģ® ĠViewModel . Ċ Ġ* Ġ@ param Ġapp Ġ ãĤ¢ãĥĹãĥªãĤ±ãĥ¼ãĤ·ãĥ§ãĥ³ .( ViewModel Provider ĠãĤĴ ä½¿çĶ¨ ãģĻãĤĭ éĻĲ ãĤĬ ãĢģ çī¹ ãģ« æĦı èŃ ĺ ãģĻãĤĭå¿ħè¦ģ ãģ¯ ãģªãģĦ .) Ċ Ġ*/ Ċ class ĠTimer ViewModel ( private Ġval Ġapp : ĠApplication ) Ġ: ĠAndroid ViewModel ( app ), ĠK oin Component Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¤ĩ æķ° ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãĤĴ ç®¡çĲĨ ãģĻãĤĭ ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ æľ¬ ä½ĵ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmulti Timer Model Ġ= ĠMulti Timer Model ( get ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ º ĸ åĤ Ļ ä¸Ń ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãĤĴ ãĥĨ ãĤŃ ãĤ¹ãĥĪ è¡¨ç¤º ãģĻãĤĭ æķ° . ĊĠĠĠĠ Ġ* ĠTODO Ġ: Ġãĥ ĵ ãĥ¥ ãĥ¼ åģ ´ ãģĭãĤī è¨Ńå®ļ ãģĻãĤĭ ãĤĪãģĨãģ« ãģĹãģŁ ãģĦ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdisplay Next Timer Count Ġ= Ġ 3 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çı¾åľ¨ ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãģ® ãĥĨ ãĤŃ ãĤ¹ãĥĪ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcurrent Timer Text : ĠLive Data < String > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ º ĸ åĤ Ļ ä¸Ń ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãģ® ãĥĨ ãĤŃ ãĤ¹ãĥĪ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ next Timer Strings Ġ= ĠMutable List ( display Next Timer Count ) Ġ{ ĠMutable LiveData < String >() Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĭķ ä½ľ ä¸Ń ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãģ® ãĥĨ ãĤŃ ãĤ¹ãĥĪ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnext Timer Strings : ĠList < Mutable LiveData < String >> ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ next Timer Strings . toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ ãģĮ åĭķ ä½ľ ãģĹãģ¦ãģĦãĤĭ ãģĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Timer Working : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmulti Timer Model . is Working ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ ãģĮ å¤īæĽ´ ãģķãĤĮãģŁ ãģ¨ ãģį ãģ® ãĥª ãĤ¹ ãĥĬ ãĥ¼ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġtimer Changed Listener Ġ= Ġobject Ġ: ĠMulti Timer Model . On Timer Changed Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Timer Changed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Next Timer Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Timer Added () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Next Timer Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Timer Removed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Next Timer Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åĪĿ æľŁ åĮĸ åŃĲ ãģ§ è¨Ńå®ļ ãĤĴè¡Į ãģĨ ãģ¨ Ġ' Type Ġchecking Ġhas Ġrun Ġinto Ġa Ġrecursive Ġproblem .' ĠãģĮ çĻº çĶŁ ãģĹãģ¦ ãģĹãģ¾ ãģĨ ãģ®ãģ§ ãģĵ ãģĵ ãģ§ è¡Į ãģĨ . ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . on Timer Changed Listener Ġ= Ġtimer Changed Listener ĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ĩ ãĤŃ ãĤ¹ãĥĪ ãģĮ ç©º çĻ½ ãģª ãģ®ãģ§ ãĢģ æĽ´æĸ° ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġupdate Next Timer Text () ĊĊĠĠĠĠĠĠĠ Ġcurrent Timer Text Ġ= ĠTransform ations . switch Map ( multi Timer Model . active Timer Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Model Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransform ations . map ( timer Model . seconds ) Ġ{ Ġseconds Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Timer String From Seconds ( seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãģ® ãĤ¹ãĤ¿ ãĥ¼ãĥĪ ãĤĴ ĠModel Ġãģ« ä¼ Ŀ ãģĪãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Tick () Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . start Current Timer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãģ® åģľæŃ¢ ãĤĴ ĠModel Ġãģ« ä¼ Ŀ ãģĪãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop Tick () Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . stop Current Timer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãģ® è¿½åĬł ãĤĴ ĠModel Ġãģ« ä¼ Ŀ ãģĪãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Timer ( on Failure Listener : Ġ() Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . add Timer ( on Failure Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãģ® åīĬéĻ¤ ãĤĴ ĠModel Ġãģ« ä¼ Ŀ ãģĪãĤĭ . ĊĠĠĠĠ Ġ* Ġ@ param Ġon Failure Listener ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãģ® åīĬéĻ¤ ãģ« å¤± æķ Ĺ ãģĹãģŁ ãģ¨ ãģį ãģ® åĭķ ä½ľ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Timer ( on Failure Listener : Ġ() Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . remove Current Timer ( on Failure Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãĤĴ ãĥª ãĤ»ãĥĥãĥĪ ãģĻãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreset Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . reset Current Timer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ãĤĴ æ¬¡ãģ® ãĤĤãģ® ãģ« ãģĻãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġãĥ Ĩ ãĤŃ ãĤ¹ãĥĪ æĥħåł± ãģĭãĤī ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãĤĴ è¨Ńå®ļ ãģĻãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetCurrent Timer From ( minutes : ĠString , Ġseconds : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġminutes Long Ġ= Ġminutes . to Long () ĊĠĠĠĠĠĠĠ Ġval Ġseconds Long Ġ= Ġseconds . to Long () ĊĊĠĠĠĠĠĠĠ Ġmulti Timer Model . active Timer Seconds Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( TimeUnit . MIN UTES . to Seconds ( minutes Long ) Ġ+ Ġseconds Long ). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ¿ ãĤ¤ ãĥŀ ãĥ¼ æĥħåł± ãģĭãĤī ãĥĨ ãĤŃ ãĤ¹ãĥĪ æĥħåł± ãģ« å¤ī æıĽ ãģĻãĤĭ . ĊĠĠĠĠ Ġ* Ġ@ return ĠåĪĨ ãĢģ ç§Ĵ ãģ® éłĨ çķª ãģ§ æł¼ ç´ į ãģķãĤĮãģŁ æĸĩåŃĹåĪĹ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Timer String (): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseconds Long Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( multi Timer Model . active Timer Seconds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġtimer Ġis Ġnot Ġinitialized " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Long () ĊĠĠĠĠĠĠĠ Ġreturn ĠPair (( seconds Long Ġ/ Ġ 6 0 ). toString (), Ġ( seconds Long Ġ% Ġ 6 0 ). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ãģĿãĤĮ ãģ ŀ ãĤĮ ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ çµĤ äºĨ æĻĤ ãģ® åĭķ ä½ľ ãĤĴè¨Ńå®ļ ãģĻãĤĭ . ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġ ãĥª ãĤ¹ ãĥĬ ãĥ¼ æľ¬ ä½ĵ .( null ĠãĤĴ è¨Ńå®ļ ãģĻãĤĭãģ¨ Ġ è§£ éĻ¤ ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Timer End Listener ( listener : ĠTimer Model . On Ended Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Timer Model . on Each Timer Ended Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ ¬ ¡ ãģ® ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãģ® è¡¨ç¤º ãĤĴ æĽ´æĸ° ãģĻãĤĭ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Next Timer Text () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ äºĪ ãĤģ ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ ãģĮ çĦ¡ ãģĦ æĸĩåŃĹåĪĹ ãģ§ åĪĿ æľŁ åĮĸ ãģĹãģ¦ ãģĭãĤī ãĤ¿ãĤ¤ ãĥŀ ãĥ¼ãĤĴ åıĸå¾Ĺ ãģĹãģ¦ æĸĩåŃĹåĪĹ ãĤĴ æĽ´æĸ° ãģĻãĤĭ . ĊĠĠĠĠĠĠĠ Ġ_ next Timer Strings . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . post Value ( app . application Context . getString ( R . string . timer _ invalid _ text )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtimers Ġ= Ġmulti Timer Model . timer List ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtimers . forEach Ġ{ Ġtimer Text Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Text Ġ!= Ġtimers . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Text . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ next Timer Strings [ index ++ ]. post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Timer String From Seconds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( it . seconds . value ) Ġ{ Ġ" This Ġtimer Ġis Ġnot Ġinitialized " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ç§Ĵ æķ° ãģĭãĤī ãĥķãĤ© ãĥ¼ãĥ ŀ ãĥĥãĥĪ ãģĹãģŁ æĸĩåŃĹåĪĹ ãģ« å¤īæĽ´ . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġinput Seconds Ġ ç§Ĵ æķ° . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ note Ġ ç§Ĵ æķ° ãģĮ è² ł ãģ® åĢ¤ ãģ® åł´åĲĪãģ¯ 0 ç§Ĵ ãģ¨ãģĹãģ¦ æī ± ãģĨ . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Timer String From Seconds ( input Seconds : ĠFloat ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Seconds Ġ= Ġmax ( ceil ( input Seconds ). to Long (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . SECONDS . to Minutes ( timer Seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= ĠTimeUnit . SECONDS . to Seconds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Seconds Ġ- ĠTimeUnit . MIN UTES . to Seconds ( minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ(" % 0 2 d :% 0 2 d ". format ( minutes , Ġseconds )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ