package Ġorg . tech town . re pose Ċ Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . navigation . Nav Controller Ċ Ċ import Ġandroidx . navigation . fragment . find Nav Controller ĊĊ Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . tech town . re pose . Data .* Ċ import Ġorg . tech town . re pose . Service . Alarm Receiver Ċ import Ġorg . tech town . re pose . Service . med al Alarm Receiver Ċ import Ġorg . tech town . re pose . server . Ret rofit Client Ċ import Ġorg . tech town . re pose . server . Ret rofit Service Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġjava . util .* ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġnav Controller : Nav Controller Ġ// ĠëĦ ¤ ë¹Ħ ê²Į ìĿ´ ìħĺ Ġì»¨ íĬ¸ ë¡ ¤ ëŁ¬ ĊĊĠĠĠ Ġlateinit Ġvar Ġdb : ĠApp Database ĊĠĠĠ Ġlateinit Ġvar Ġretrofit : ĠRet rofit ĊĠĠĠ Ġlateinit Ġvar Ġsupp lement Service Ġ: ĠRet rofit Service ĊĠĠĠ Ġlateinit Ġvar Ġalarm Manager : ĠAlarm Manager ĊĠĠĠ Ġ// ìķ Į ë¦ ¼ ĠìĦ¤ìłķ ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġ// Ġpose Ġë¦¬ ìĬ¤íĬ¸ ĊĠĠĠĠĠĠĠ Ġval Ġpose _ list Ġ= ĠlistOf < String >(" ëĭ¤ ë¦¬ ê ¼ ¬ ê¸° "," íķľ Ġì ª ½ ìľ¼ë¡ľ Ġì§ Ĳ Ġëĵ¤ ê¸° "," ìŀ¥ ìĭľ ê°Ħ Ġìķ ī ìķĦ ĠìŀĪ ê¸° "," ìŀ¥ ìĭľ ê°Ħ ĠìĦľ ĠìŀĪ ê¸° ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ìŀ¥ ìĭľ ê°Ħ ĠìłĦ ìŀĲ ê¸° ê¸° ĠìĤ¬ìļ© "," ìŀ¥ ìĭľ ê°Ħ Ġëı ħ ìĦľ ", Ġ" ìŀ¥ ìĭľ ê°Ħ ĠíķĦ ê¸° "," ìŀ¥ ìĭľ ê°Ħ Ġìļ ´ ìłĦ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" íĮ Ķ ìŀĲ ê± ¸ ìĿĮ "," ìķĪ ì§ ± ê± ¸ ìĿĮ "," ìĸ ĳ ë°ĺ ëĭ¤ ë¦¬ ", Ġ" ìĹ İ ëĵľ ëł¤ ìŀĲ ê¸° ") ĊĠĠĠĠĠĠĠ Ġvar Ġuser _ pose Ġ= Ġmutable ListOf < Boolean >( false , false , false , false , false , false , false , false , false , false , false , false ) Ġ// ĠìĤ¬ ìĿ´ ì¦ Ī Ġ: Ġ 1 2 ĊĠĠĠĠĠĠĠ Ġvar Ġuser _ timer Ġ= Ġmutable ListOf < Boolean >( false , false , false , false , false , false , false , false , false , false , false , false , false , false , false , false ) Ġ// ĠìĤ¬ ìĿ´ ì¦ Ī Ġ: Ġ 1 6 ĊĠĠĠĠĠĠĠ Ġvar Ġuser _ days Ġ= Ġmutable ListOf < Boolean >( false , false , false , false , false , false , false ) Ġ// ĠìĤ¬ ìĿ´ ì¦ Ī Ġ: Ġ 7 ĊĠĠĠĠĠĠĠ Ġvar Ġuser _ med al Ġ= Ġmutable ListOf < Boolean >( false , false , false , false , false , false , false , false ) Ġ// ĠìĤ¬ ìĿ´ ì¦ Ī Ġ: Ġ 8 ĊĠĠĠĠĠĠĠ Ġvar Ġuser _ confirm Num Ġ= Ġ 0 Ġ// Ġìļ ´ë ı Ļ ìĻ Ħ ë£Į Ġë²Ħ íĬ ¼ Ġë Ī Ħ ë¥¸ Ġí ļ Ł ìĪĺ ĊĠĠĠĠĠĠĠ Ġvar Ġuser _ join Data Ġ= Ġ" a " Ġ// Ġìļ ´ë ı Ļ ìĻ Ħ ë£Į Ġë²Ħ íĬ ¼ Ġë Ī Ħ ë¥¸ Ġí ļ Ł ìĪĺ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġ// Ġìŀ Ħ ìĿĺ ë¡ľ Ġuser Ġê°Ŀì²´ ĠíķĺëĤĺ Ġë§Į ëĵ ¦ ĊĠĠĠĠĠĠĠ Ġnav Controller Ġ= Ġnav _ host _ fragment . find Nav Controller () ĊĠĠĠĠĠĠĠ ĠLog . e (" main Activity "," _ on created !! ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// network Ġretrofit ĊĠĠĠ Ġfun Ġinit Ret rofit () Ġ{ ĊĠĠĠĠĠĠĠ Ġretrofit Ġ= ĠRet rofit Client . getInstance () ĊĠĠĠĠĠĠĠ Ġsupp lement Service Ġ= Ġretrofit . create ( Ret rofit Service :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Room DB ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Ġ= ĠApp Database . getInstance ( context ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġset Pos ing Alarm ( is checked : ĠBoolean , Ġnotification Id : Int , Ġlistener Context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġalarm Manager Ġ= Ġlistener Context . getSystem Service ( ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĠĠĠĠĠĠĠ Ġval Ġalarm Intent Ġ= ĠIntent ( listener Context , ĠAlarm Receiver :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Context , Ġnotification Id , Ġalarm Intent , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġif ( is checked ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepeat Interval : ĠLong Ġ= Ġ 2 4 * Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ĠĠ Ġ// Ġ 2 4 h ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar : ĠCalendar Ġ= ĠCalendar . getInstance (). apply Ġ{ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime In Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( Calendar . HOUR _ OF _ DAY , Ġ( notification Id Ġ* Ġ 9 0 )/ 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( Calendar . MINUTE , Ġ( notification Id Ġ* Ġ 9 0 )% 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . set Repe ating ( Alarm Manager . RTC _ WAKE UP , Ġ// Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Interval , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" alarm Ġis Ġsetting Ġ$ notification Id ", alarm Manager . toString ()) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . cancel ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" alarm Ġis Ġcanceled Ġ$ notification Id ", alarm Manager . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġset Med al Alarm ( notification Id : Int , Ġlistener Context : ĠContext , Ġmed al Idx : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġalarm Manager Ġ= Ġlistener Context . getSystem Service ( ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĠĠĠĠĠĠĠ Ġval Ġalarm Intent Ġ= ĠIntent ( listener Context , Ġmed al Alarm Receiver :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Context , Ġnotification Id , Ġalarm Intent , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Room DB ( listener Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ret rofit () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom DB Update Med al Of UserData ( med al Idx , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Med al Ġ: String Ġ= ĠParse Data From List ToString ( Room DB Get Med al Of UserData ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Med al Of UserData Ġ= ĠUpdate Med al Of UserData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Med al , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom DB Get UserId Of UserData () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Call Update Med al Of UserData ( update Med al Of UserData ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġalarm Manager . set ( Alarm Manager . RTC _ WAKE UP , Ġ// Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis + 2 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Intent ) ĊĊĠĠĠĠĠĠĠ ĠLog . e (" alarm Ġis Ġsetting Ġ$ notification Id ", alarm Manager . toString ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun ĠRoom DB Update Med al Of UserData ( Ġupdate Index : ĠInt , Ġset : ĠBoolean ){ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Id Ġ= Ġdb . user Dao (). getUser Data () !!. id ĊĠĠĠĠĠĠĠ Ġvar Ġtmp List Ġ= Ġdb . user Dao (). getUser Data () !!. med al . to Mutable List () ĊĠĠĠĠĠĠĠ Ġtmp List [ update Index ] Ġ= Ġset ĊĠĠĠĠĠĠĠ Ġuser _ med al Ġ= Ġtmp List ĊĠĠĠĠĠĠĠ Ġdb . user Dao (). update UserData Med al ( tmp Id , Ġtmp List . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠRoom DB Get Med al Of UserData (): List < Boolean >{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb . user Dao (). getUser Data () !!. med al ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠRoom DB Get UserId Of UserData (): String { ĊĠĠĠĠĠĠĠ Ġreturn Ġdb . user Dao (). getUser Data () !!. id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠApi Call Update Med al Of UserData ( update Med al Of UserData : ĠUpdate Med al Of UserData ): Int Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresponse Code : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġsupp lement Service . update _ med al ( update Med al Of UserData ). enqueue ( object : Ġretrofit 2 . Callback < Before Parsing UserData > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Before Parsing UserData >, Ġresponse : ĠResponse < Before Parsing UserData >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( response . code () Ġ== Ġ 2 0 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" server "," response ĠìĦ± ê³µ !! ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" response Ġ: Ġ", Ġresponse . body (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" response code Ġ: Ġ", Ġresponse . code (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Code Ġ= Ġresponse . code () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Before Parsing UserData >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" server "," fail ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" server _ throwable ", t . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" server _ call ", call . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠLog . e (" fun Ġcode ", response Code . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠParse Data From List ToString ( list : ĠList < Boolean >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstr : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor ( ele Ġin Ġlist ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ele ) Ġstr Ġ+= Ġ" 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġstr Ġ+= Ġ" 0 " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstr ĊĠĠĠ Ġ} Ċ }