package Ġcom . gl ady sproject . gl ad ys . adapters Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . Switch Ċ import Ġcom . gl ady sproject . gl ad ys . R Ċ import Ġcom . gl ady sproject . gl ad ys . database . Gl ad ys Db Ċ import Ġcom . gl ady sproject . gl ad ys . database . entity . DeviceType Ċ import Ġcom . gl ady sproject . gl ad ys . database . entity . Rooms Ċ import Ġcom . gl ady sproject . gl ad ys . utils . Adapter Callback Ċ import Ġcom . h 6 ah 4 i . android . widget . adv recyclerview . expand able . RecyclerView Expand able Item Manager Ċ import Ġcom . h 6 ah 4 i . android . widget . adv recyclerview . utils . Abstract Expand able Item Adapter Ċ import Ġcom . h 6 ah 4 i . android . widget . adv recyclerview . utils . Abstract Expand able Item ViewHolder Ċ import Ġkotlinx . android . synt hetic . main . card _ device _ binary . view .* Ċ import Ġkotlinx . android . synt hetic . main . card _ device _ mult ile vel . view .* Ċ import Ġkotlinx . android . synt hetic . main . card _ device _ room . view .* Ċ import Ġkotlinx . android . synt hetic . main . card _ device _ sensor . view .* Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . ad w . library . widgets . discrete seek bar . Discrete Seek Bar Ċ Ċ class ĠDevice Type Adapter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdevice Type By Room : ĠMutable List < Rooms >, ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcontext Ġ: ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcallbacks : ĠAdapter Callback . Adapter Callback Device State ) Ġ: ĊĠĠĠĠĠĠĠ ĠAbstract Expand able Item Adapter < DeviceType Adapter . Room VH , ĠRecyclerView . ViewHolder >() Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġset Has Stable Ids ( true ) Ġ// Ġthis Ġis Ġrequired Ġfor Ġexpand able Ġfeature . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Group Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdevice Type By Room . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Child Count ( group Position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdevice Type By Room [ group Position ]. device Types . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget GroupId ( group Position : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdevice Type By Room [ group Position ]. id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Child Id ( group Position : ĠInt , Ġchild Position : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdevice Type By Room [ group Position ]. device Types [ child Position ]. id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Check Can Expand Or Collapse Group ( holder : ĠRoom VH , Ġgroup Position : ĠInt , Ġx : ĠInt , Ġy : ĠInt , Ġexpand : ĠBoolean ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdate Ġstate Ġin Ġlist Ġfor Ġon Bind Ġ Ġfunction Ġ*/ ĊĠĠĠĠĠĠĠ Ġdevice Type By Room [ group Position ]. is Expanded Ġ= Ġexpand ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSave Ġstate Ġin Ġdatabase Ġ*/ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lad ys Db . database ?. rooms Dao ()?. update Room Expand ( expand , Ġdevice Type By Room [ group Position ]. id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Child Item ViewType ( group Position : ĠInt , Ġchild Position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( device Type By Room [ group Position ]. device Types [ child Position ]. sensor ?. toInt () Ġ== Ġ 1 ) Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ Ġwhen Ġ( device Type By Room [ group Position ]. device Types [ child Position ]. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" binary " Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Group ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRoom VH ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRoom VH ( LayoutInflater . from ( parent . context ). inflate ( R . layout . card _ device _ room , Ġparent , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Child ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠBinary VH ( LayoutInflater . from ( parent . context ). inflate ( R . layout . card _ device _ binary , Ġparent , Ġfalse )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠMult ile vel VH ( LayoutInflater . from ( parent . context ). inflate ( R . layout . card _ device _ mult ile vel , Ġparent , Ġfalse )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSensor VH ( LayoutInflater . from ( parent . context ). inflate ( R . layout . card _ device _ sensor , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Group ViewHolder ( holder : ĠRoom VH , Ġgroup Position : ĠInt , Ġview Type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . item View . is Clickable ĊĠĠĠĠĠĠĠ Ġholder . bind ( device Type By Room [ group Position ]) ĊĊĠĠĠĠĠĠĠ Ġif ( device Type By Room [ group Position ]. is Expanded ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . card _ room . show Corner ( true , Ġtrue , Ġfalse , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . divider . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . room _ arrow . display ed Child Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . card _ room . show Corner ( true , Ġtrue , Ġtrue , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . divider . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . room _ arrow . display ed Child Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Child ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġgroup Position : ĠInt , Ġchild Position : ĠInt , Ġview Type : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠBind Ġview Ġcompared Ġto Ġview Ġtype Ġand Ġset Ġthe Ġcorner Ġof Ġcard Ġif Ġthe Ġchild Ġis Ġa Ġlast Ġgh ild Ġof Ġthe Ġgroup */ ĊĊĠĠĠĠĠĠĠ Ġwhen ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder Ġas ĠBinary VH ). bind ( device Type By Room [ group Position ]. device Types [ child Position ], Ġdevice Type By Room , Ġgroup Position , Ġcontext , Ġcallbacks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Position Ġ+ Ġ 1 Ġ== Ġdevice Type By Room [ group Position ]. device Types . size ) Ġholder . item View . card _ device _ binary . show Corner ( false , Ġfalse , Ġtrue , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġholder . item View . card _ device _ binary . show Corner ( false , Ġfalse , Ġfalse , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder Ġas ĠMult ile vel VH ). bind ( device Type By Room [ group Position ]. device Types [ child Position ], Ġcontext , Ġcallbacks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Position Ġ+ Ġ 1 Ġ== Ġdevice Type By Room [ group Position ]. device Types . size ) Ġholder . item View . card _ device _ mult ile vel . show Corner ( false , Ġfalse , Ġtrue , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġholder . item View . card _ device _ mult ile vel . show Corner ( false , Ġfalse , Ġfalse , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder Ġas ĠSensor VH ). bind ( device Type By Room [ group Position ]. device Types [ child Position ], Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Position Ġ+ Ġ 1 Ġ== Ġdevice Type By Room [ group Position ]. device Types . size ) Ġholder . item View . card _ device _ sensor . show Corner ( false , Ġfalse , Ġtrue , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġholder . item View . card _ device _ sensor . show Corner ( false , Ġfalse , Ġfalse , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRoom VH ( item View : ĠView ) Ġ: ĠAbstract Expand able Item ViewHolder ( item View ){ ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( room : ĠRoom s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . room _ name . text Ġ= Ġroom . name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBinary VH ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ){ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( device Type : ĠDevice Type , Ġdevice Type By Room : ĠMutable List < Rooms >, Ġgroup Position : ĠInt , Ġcontext : ĠContext , Ġcallbacks : ĠAdapter Callback . Adapter Callback Device State ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . device TypeName Ġ!= Ġnull Ġ&& Ġdevice Type . device TypeName Ġ!= Ġ"") item View . device _ binary _ name . text Ġ= Ġdevice Type . device TypeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠitemView . device _ binary _ name . text Ġ= Ġ"${ context . getString ( R . string . dev ic etype )} Ġ: Ġ${ device Type . id }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . tag Ġ!= Ġnull ) item View . device _ binary _ tag . text Ġ= Ġdevice Type . tag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠitemView . device _ binary _ tag . text Ġ= Ġcontext . getString ( R . string . no _ tag ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . device _ binary _ value . setOn Checked ChangeListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . last Value Ġ!= Ġnull ) ĠitemView . device _ binary _ value . isChecked Ġ= Ġdevice Type . last Value Ġ== Ġ 1 . toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < Switch >( R . id . device _ binary _ value ). setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Type By Room [ group Position ]. is Expanded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġcallbacks . onClick Callback Device State ( device Type . id , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcallbacks . onClick Callback Device State ( device Type . id , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMult ile vel VH ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ){ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( device Type : ĠDevice Type , Ġcontext : ĠContext , Ġcallbacks : ĠAdapter Callback . Adapter Callback Device State ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . device TypeName Ġ!= Ġnull Ġ&& Ġdevice Type . device TypeName Ġ!= Ġ"") item View . device _ mult ile vel _ name . text Ġ= Ġdevice Type . device TypeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠitemView . device _ mult ile vel _ name . text Ġ= Ġ"${ context . getString ( R . string . dev ic etype )} Ġ: Ġ${ device Type . id }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . tag Ġ!= Ġnull ) item View . device _ mult ile vel _ tag . text Ġ= Ġdevice Type . tag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠitemView . device _ mult ile vel _ tag . text Ġ= Ġcontext . getString ( R . string . no _ tag ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . device _ mult ile vel _ value . max Ġ= Ġdevice Type . max !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . last Value Ġ!= Ġnull ) ĠitemView . device _ mult ile vel _ value . progress Ġ= Ġdevice Type . last Value !!. toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < Discrete Seek Bar >( R . id . device _ mult ile vel _ value ). setOn Progress ChangeListener ( object Ġ: ĠDis crete Seek Bar . On Progress ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠDis crete Seek Bar , Ġvalue : ĠInt , Ġfrom User : ĠBoolean ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠDis crete Seek Bar ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠDis crete Seek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . onClick Callback Device State ( device Type . id , Ġseek Bar . progress . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSensor VH ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ){ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( device Type : ĠDevice Type , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . device TypeName Ġ!= Ġnull Ġ&& Ġdevice Type . device TypeName Ġ!= Ġ"") item View . device _ sensor _ name . text Ġ= Ġdevice Type . device TypeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠitemView . device _ sensor _ name . text Ġ= Ġ"${ context . getString ( R . string . dev ic etype )} Ġ: Ġ${ device Type . id }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device Type . tag Ġ!= Ġnull ) item View . device _ sensor _ tag . text Ġ= Ġdevice Type . tag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠitemView . device _ sensor _ tag . text Ġ= Ġcontext . getString ( R . string . no _ tag ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . device _ sensor _ value . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Type . last Value Ġ!= Ġnull Ġ&& Ġdevice Type . unit Ġ!= Ġnull ) Ġ"${ device Type . last Value } Ġ${ device Type . unit }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( device Type . last Value Ġ!= Ġnull ) Ġ"${ device Type . last Value }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" null " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġset Expanded Groups ( device Type By Room : ĠMutable List < Rooms >, Ġexpand able Item Manager : ĠRecyclerView Expand able Item Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġroom ) Ġin Ġdevice Type By Room . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room . is Expanded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand able Item Manager . expand Group ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }