package Ġcom . en xy . n ool ite . features Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . en xy . n ool ite . core . data . Action .* Ċ import Ġcom . en xy . n ool ite . core . data . Channel Action Ċ import Ġcom . en xy . n ool ite . core . data . Dummy Ċ import Ġcom . en xy . n ool ite . core . data . Group Ċ import Ġcom . en xy . n ool ite . core . data . Script Ċ import Ġcom . en xy . n ool ite . core . exception . Failure Ċ import Ġcom . en xy . n ool ite . core . network . ConnectionManager Ċ import Ġcom . en xy . n ool ite . core . network . Repository Ċ import Ġcom . en xy . n ool ite . features . settings . Settings Manager Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /* Ċ * ĠMain ViewModel Ġcontains Ġdata Ġwhich Ġis Ġshared Ġand Ġused Ġacross Ġthe Ġapp Ġ( fragments ). Ċ */ Ċ class ĠMain ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġsettings Manager : ĠSettings Manager , ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠĠĠ Ġprivate Ġval Ġconnection Manager : ĠConnection Manager Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġval Ġscript List Ġ= ĠMutable LiveData ( ArrayList < Script >()) ĊĠĠĠ Ġval Ġscript List Failure Ġ= ĠMutable LiveData < Failure >() ĊĊĠĠĠ Ġval Ġgroup List Ġ= ĠMutable LiveData ( ArrayList < Group >()) ĊĠĠĠ Ġval Ġgroup List Failure Ġ= ĠMutable LiveData < Failure >() ĊĊĠĠĠ Ġval Ġfavour ite Group Ġ= ĠMutable LiveData < Group >() ĊĠĠĠ Ġval Ġfavour ite Group Failure Ġ= ĠMutable LiveData < Failure >() ĊĊĠĠĠ Ġval Ġis Wifi Connected : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconnection Manager . is Wifi Connected () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApp Ġhas Ġtwo Ġoptions Ġfor Ġturning Ġon Ġand Ġoff Ġthe Ġlight . ĊĠĠĠĠ Ġ* Ġif Ġhas ToggleButton Ġ== Ġtrue , Ġthen Ġthere Ġwill Ġbe Ġonly Ġone Ġbutton Ġ( toggle ). ĊĠĠĠĠ Ġ* ĠOtherwise , Ġthere Ġwill Ġbe Ġtwo Ġbuttons Ġ- Ġturn Ġon Ġand Ġturn Ġoff . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġhas ToggleButton : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsettings Manager . has ToggleButton ĊĊĠĠĠ Ġval Ġtheme Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsettings Manager . current Theme ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Group List ( settings Manager . ipAddress ) ĊĠĠĠĠĠĠĠ Ġfetch F avour ite Group () ĊĠĠĠĠĠĠĠ Ġfetch Scripts () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġsingle Ġaction Ġon Ġthe Ġchannel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdo Action ( channel Action : ĠChannel Action ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( channel Action . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT URN _ OFF Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. turn Off Light ( channel Action . channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT URN _ ON Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. turn On Light ( channel Action . channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ STATE Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. change Light State ( channel Action . channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHANGE _ BR IGHT NESS Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. change Back light Brightness ( channel Action . channelId , Ġchannel Action . brightness !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHANGE _ COLOR Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. change Back light Color ( channel Action . channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTART _ OVER FLOW Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Back light Overflow ( channel Action . channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTOP _ OVER FLOW Ġ-> Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stop Back light Overflow ( channel Action . channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġthe Ġgiven Ġscript Ġ( per forms Ġactions Ġon Ġall Ġchannels Ġin Ġthe Ġscript ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrun Script ( script : ĠScript ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( channel Action Ġin Ġscript . actions List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Action ( channel Action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Group List ( ipAddress : ĠString , Ġis Force Updating : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . getGroup List ( ipAddress , Ġis Force Updating ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. either (:: handle Group List Failure , Ġ:: handle Group List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Group List ( group List : ĠArrayList < Group >) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Group List ( group List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch F avour ite Group () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . getF avour ite Group () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. either (:: handle F avour ite Group Failure , Ġ:: handle F avour ite Group ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Scripts () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Scripts (). either (:: handle Script List Failure , Ġ:: handle Script List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Script ( script : ĠScript ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . script List . value !!. add ( script ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Scripts ( script List . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Script ( script : ĠScript ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . script List . value !!. remove ( script ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Scripts ( script List . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset F avour ite Group ( group : ĠGroup ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Main ViewModel . fav our ite Group . value Ġ= Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save F avour ite Group Element ( group ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear s Ġfavour ite Ġgroup Ġand Ġremoves Ġit Ġfrom Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear F avour ite Group () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fav our ite Group . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . fav our ite Group Failure . value Ġ= ĠFailure . Data NotFound ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . remove F avour ite Group () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġtheme Ġrelated Ġvalues Ġin Ġ[ Settings Manager ]. ĊĠĠĠĠ Ġ* ĠShould Ġbe Ġused Ġin ĠActivity Ġto Ġretrieve Ġbundled Ġdata ĊĠĠĠĠ Ġ* Ġafter Ġ" theme Ġchange " Ġ( activity Ġrestart ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Theme Change Values ( ĊĠĠĠĠĠĠĠ Ġ_ theme Changed : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtheme Name : ĠString , ĊĠĠĠĠĠĠĠ Ġsettings Scroll X : ĠInt , ĊĠĠĠĠĠĠĠ Ġsettings Scroll Y : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings Manager . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtheme Changed Ġ= Ġ_ theme Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Theme Ġ= Ġtheme Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll X Ġ= Ġsettings Scroll X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Y Ġ= Ġsettings Scroll Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Group List ( group List : ĠArrayList < Group >) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Main ViewModel . group List . value Ġ= Ġgroup List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Group List ( group List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Script List ( script List : ĠArrayList < Script > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . script List . value Ġ= Ġscript List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Group List Failure ( failure : ĠFailure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . group List Failure . value Ġ= Ġfailure ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle F avour ite Group ( group : ĠGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fav our ite Group . value Ġ= Ġgroup ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle F avour ite Group Failure ( failure : ĠFailure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fav our ite Group Failure . value Ġ= Ġfailure ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Script List Failure ( failure : ĠFailure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . script List Failure . value Ġ= Ġfailure ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġtest Ġdata Ġto Ġshow case Ġapp Ġfunctionality / design . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset TestData () Ġ{ ĊĠĠĠĠĠĠĠ Ġgroup List Failure . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfavour ite Group Failure . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġscript List Failure . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġgroup List . value Ġ= ĠDummy . group List ĊĠĠĠĠĠĠĠ Ġfavour ite Group . value Ġ= ĠDummy . fav our ite Group ĊĠĠĠĠĠĠĠ Ġscript List . value Ġ= ĠDummy . script List ĊĠĠĠ Ġ} Ċ }