package Ġuk . co less oft . android . h ill list . ui . view model Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġuk . co less oft . android . h ill list . dao . H ills Order Ċ import Ġuk . co less oft . android . h ill list . dao . Is H ill Cli mbed Ċ import Ġuk . co less oft . android . h ill list . database . B rit ish H ills Datasource Ċ import Ġuk . co less oft . android . h ill list . domain . H ill Detail Ċ import Ġuk . co less oft . android . h ill list . domain . H ill Search Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġandroidx . lifecycle . Transform ations ĊĊ Ċ class ĠH ill List ViewModel Ġ@ Inject Ġconstructor ( override Ġval Ġrepository : ĠBrit ish H ills Datasource , Ġval Ġh ill Search : ĠH ill Search ) Ġ: ĠH ill Hold ing ViewModel (), H ill Listing ViewModel Ġ{ ĊĊĠĠĠ Ġval Ġh ills : ĠLive Data < List < H ill Detail >> ĊĊĠĠĠ Ġoverride Ġval Ġselected Ġ: ĠLive Data < H ill Detail > ĊĠĠĠ Ġprivate Ġvar Ġcurrent Order Ġ= ĠH ills Order . HEIGHT _ DESC ĊĠĠĠ Ġprivate Ġvar Ġfilter Cli mbed : ĠIs H ill Cli mbed ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsearch String : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġfilter LiveData Ġ= ĠMutable LiveData < Search Filter >() ĊĠĠĠ Ġprivate Ġval Ġselect LiveData Ġ= ĠMutable LiveData < Long >() ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġh ills Ġ= ĠTransform ations . switch Map < Search Filter ?, ĠList < H ill Detail >>( filter LiveData ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġfilter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwhere Clause Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcli mbed Sql Ġ= Ġfilter ?. cli mbed ?. sql Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Sql Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( h ill Search . more Filters Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh ill Search . more Filters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfilter ?. search String ?. let Ġ{ Ġ"${ filter . search String }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"" }. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġand Ġ= Ġfilter ?. cli mbed ?. sql ?. let Ġ{ Ġ" ĠAND Ġ" Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ cli mbed Sql $ and $ search Sql " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. invoke () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform ations . map < Mutable List < H ill Detail > ?, ĠList < H ill Detail >? >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get H ills ( h ill Search . groupId , Ġh ill Search . country , Ġwhere Clause )) Ġ{ Ġresult Ġ-> Ġresult ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsort H ills ( it , Ġcurrent Order ) Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( select LiveData . value Ġ== Ġnull ) Ġselect LiveData . post Value ( result !!. get ( 0 ). h ill . h _ id )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfilter LiveData . post Value ( Search Filter ( null , Ġnull , ĠH ills Order . HEIGHT _ DESC )) ĊĊĠĠĠĠĠĠĠ Ġselected Ġ= ĠTransform ations . switch Map ( select LiveData ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh ill Id Ġ-> Ġrepository . get H ill Reactive ( h ill Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġmark All H ills Cli mbed () Ġ{ ĊĠĠĠĠĠĠĠ Ġh ills . value ?. forEach Ġ{ Ġh ill Ġ-> Ġrepository . mark H ill Cli mbed ( h ill . h ill . h _ id , ĠDate (), Ġ"") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmark All H ills Not Cli mbed () Ġ{ ĊĠĠĠĠĠĠĠ Ġh ills . value ?. forEach ({ Ġh ill Ġ-> Ġrepository . mark H ill Not Cli mbed ( h ill . h ill . h _ id ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġorder H ills ( order : ĠH ills Order ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" order =", Ġorder . sql ) ĊĠĠĠĠĠĠĠ Ġcurrent Order Ġ= Ġorder ĊĠĠĠĠĠĠĠ Ġfilter LiveData . value Ġ= ĠSearch Filter ( filter Cli mbed , Ġsearch String , Ġcurrent Order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfilter Cli mbed ( cli mbed : ĠIs H ill Cli mbed ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfilter Cli mbed Ġ= Ġcli mbed ĊĠĠĠĠĠĠĠ Ġfilter LiveData . value Ġ= ĠSearch Filter ( filter Cli mbed , Ġsearch String , Ġcurrent Order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch H ills ( search : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . search String Ġ= Ġsearch ĊĠĠĠĠĠĠĠ Ġfilter LiveData . value Ġ= ĠSearch Filter ( filter Cli mbed , Ġsearch String , Ġcurrent Order ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġselect ( h ill Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselect LiveData . value Ġ= Ġh ill Id ĊĠĠĠ Ġ} Ċ Ċ }