package Ġcom . acon no . sensor ics . ui . actions Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . arch . lifecycle . Android ViewModel Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġcom . acon no . sensor ics . R Ċ import Ġcom . acon no . sensor ics . domain . actions . General Action Ċ import Ġcom . acon no . sensor ics . domain . actions . outcome s . Outcome Ċ import Ġcom . acon no . sensor ics . domain . format . Format Matcher Ċ import Ġcom . acon no . sensor ics . domain . ift tt . Condition Ċ import Ġcom . acon no . sensor ics . domain . ift tt . Limit Condition Ċ import Ġcom . acon no . sensor ics . domain . inter actor . ift tt . action . Add Action UseCase Ċ import Ġcom . acon no . sensor ics . domain . inter actor . ift tt . action . Get Action ById UseCase Ċ import Ġcom . acon no . sensor ics . domain . model . Device Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ Ċ class ĠAction Details ViewModel ( ĊĠĠĠ Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġsaved Devices Stream : ĠFlow able < List < Device >>, ĊĠĠĠ Ġprivate Ġval Ġformat Matcher : ĠFormat Matcher , ĊĠĠĠ Ġprivate Ġval Ġget Action ById UseCase : ĠGet Action ById UseCase , ĊĠĠĠ Ġprivate Ġval Ġadd Action UseCase : ĠAdd Action UseCase Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġaction LiveData Ġ= ĠMutable LiveData < Action ViewModel >() ĊĠĠĠ Ġfun Ġget Action LiveData (): ĠLive Data < Action ViewModel > Ġ= Ġaction LiveData ĊĊĠĠĠ Ġfun Ġget Devices (): ĠSingle < List < Device >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsaved Devices Stream . first Or Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Action Id ( action Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Action ById UseCase . execute ( action Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . condition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . outcome ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Device ( device : ĠDevice , Ġname : ĠString , Ġmessage : ĠString , ĠphoneNumber : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction ViewModel Ġ= Ġaction LiveData . value ĊĠĠĠĠĠĠĠ Ġif Ġ( action ViewModel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= ĠAction ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . device Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġaction ViewModel . outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [ Outcome . PHONE _ NUMBER ] Ġ= ĠphoneNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [ Outcome . TEXT _ MESSAGE ] Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Outcome Ġ= ĠOut come ( parameters , Ġoutcome . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . outcome Ġ= Ġnew Outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= Ġaction ViewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Condition ( ĊĠĠĠĠĠĠĠ Ġreading Type : ĠString , ĊĠĠĠĠĠĠĠ Ġlimit Value : ĠString , ĊĠĠĠĠĠĠĠ Ġconstraint Type : ĠString , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠ ĠphoneNumber : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction ViewModel Ġ= Ġaction LiveData . value ĊĠĠĠĠĠĠĠ Ġif Ġ( action ViewModel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= ĠAction ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= ĠLimit Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreading Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Value . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLimit Condition . type FromString ( constraint Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . condition Ġ= ĠLimit Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreading Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Value . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLimit Condition . type FromString ( constraint Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġaction ViewModel . outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [ Outcome . PHONE _ NUMBER ] Ġ= ĠphoneNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [ Outcome . TEXT _ MESSAGE ] Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Outcome Ġ= ĠOut come ( parameters , Ġoutcome . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . outcome Ġ= Ġnew Outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= Ġaction ViewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Condition ( name : ĠString , Ġmessage : ĠString , ĠphoneNumber : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction ViewModel Ġ= Ġaction LiveData . value ĊĠĠĠĠĠĠĠ Ġif Ġ( action ViewModel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= ĠAction ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . condition Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġaction ViewModel . outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [ Outcome . PHONE _ NUMBER ] Ġ= ĠphoneNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [ Outcome . TEXT _ MESSAGE ] Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Outcome Ġ= ĠOut come ( parameters , Ġoutcome . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . outcome Ġ= Ġnew Outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= Ġaction ViewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Outcome ( outcome Type : ĠInt , Ġmessage : ĠString , ĠphoneNumber : ĠString , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġparameters [ Outcome . PHONE _ NUMBER ] Ġ= ĠphoneNumber ĊĠĠĠĠĠĠĠ Ġparameters [ Outcome . TEXT _ MESSAGE ] Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= ĠOut come ( parameters , Ġoutcome Type ) ĊĠĠĠĠĠĠĠ Ġval Ġaction ViewModel Ġ= Ġaction LiveData . value ĊĠĠĠĠĠĠĠ Ġif Ġ( action ViewModel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= ĠAction ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome Ġ= Ġoutcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ViewModel . outcome Ġ= Ġoutcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction LiveData . value Ġ= Ġaction ViewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Reading Types ( device : ĠDevice ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġformat Matcher . get Reading Types ( device . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Action ( name : ĠString , Ġmessage : ĠString , ĠphoneNumber : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġaction LiveData . value ?. id Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Comp letable Illegal ArgumentError ( R . string . message _ action _ name _ blank ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġaction LiveData . value ?. device ĊĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġaction LiveData . value ?. condition ĊĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġaction LiveData . value ?. outcome ĊĠĠĠĠĠĠĠ Ġif Ġ( device Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Comp letable Illegal ArgumentError ( R . string . message _ action _ device _ not _ selected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( condition Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Comp letable Illegal ArgumentError ( R . string . message _ action _ condition _ not _ selected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Comp letable Illegal ArgumentError ( R . string . message _ action _ outcome _ not _ selected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġparameters [ Outcome . PHONE _ NUMBER ] Ġ= ĠphoneNumber ĊĠĠĠĠĠĠĠ Ġparameters [ Outcome . TEXT _ MESSAGE ] Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġval Ġnew Outcome Ġ= ĠOut come ( parameters , Ġoutcome . type ) ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠGeneral Action ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcondition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Outcome ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Action UseCase . execute ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Comp letable Illegal ArgumentError ( message ResourceId : ĠInt ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġget Application < Application >(). getString ( message ResourceId ) ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . error ( IllegalArgumentException ( message )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠAction ViewModel ( ĊĠĠĠĠĠĠĠ Ġvar Ġid : ĠLong Ġ= Ġ 0 L , ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġdevice : ĠDevice ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġcondition : ĠCondition ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġoutcome : ĠOut come ? Ġ= Ġnull ĊĠĠĠ Ġ) Ċ }