package Ġcom . f ory ou and me . research kit . step . scale Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . f ory ou and me . core . arch . flow . UI Event Ċ import Ġcom . f ory ou and me . core . arch . flow . to UI Event Ċ import Ġcom . f ory ou and me . core . ext . launch Safe Ċ import Ġcom . f ory ou and me . research kit . result . Single Int Answer Result Ċ import Ġcom . f ory ou and me . research kit . skip . isIn Optional Range Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow . Mutable Shared Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . Shared Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġorg . th reet en . bp . Z onedDateTime Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . math . round ToInt Ċ Ċ @ H ilt ViewModel Ċ class ĠScale ViewModel Ġ@ Inject Ġconstructor () Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ/* Ġ--- Ġstate Ġ--- Ġ*/ ĊĊĠĠĠ Ġprivate Ġval Ġstate Ġ= ĠMutable State Flow ( Scale State ()) ĊĠĠĠ Ġval Ġstate Flow Ġ= Ġstate Ġas ĠState Flow < Scale State > ĊĊĠĠĠ Ġ/* Ġ--- Ġevents Ġ--- Ġ*/ ĊĊĠĠĠ Ġprivate Ġval Ġevent Ġ= ĠMutable Shared Flow < UI Event < Scale Events >>( replay Ġ= Ġ 1 ) ĊĠĠĠ Ġval Ġevent Flow Ġ= Ġevent Ġas ĠShared Flow < UI Event < Scale Events >> ĊĊĠĠĠ Ġ/* Ġ--- Ġstep Ġ--- Ġ*/ ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġset Step ( step : ĠScale Step ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġstate . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġstep , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstep . min Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Percent Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ--- Ġvalue Ġ--- Ġ*/ ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġselect Value ( value : ĠFloat ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġstate . value . step ĊĠĠĠĠĠĠĠ Ġif Ġ( step Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrounded Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( value Ġ* Ġ( step . max Value Ġ- Ġstep . min Value )) Ġ+ Ġstep . min Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrounded Value To Interval Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( rounded Value Ġ- Ġstep . min Value )/ step . interval . toFloat ()). round ToInt () Ġ* Ġstep . interval Ġ+ Ġstep . min Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġrounded Value To Interval , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Percent Ġ= Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Go Next Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsnap Value () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġstate . value . step ĊĠĠĠĠĠĠĠ Ġif Ġ( step Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnap Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state . value . value Ġ- Ġstep . min Value ). toFloat () Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( step . max Value Ġ- Ġstep . min Value ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Percent Ġ= Ġsnap Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ--- Ġskip Ġ--- Ġ*/ ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck Skip () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġskip Ġ= Ġstate . value . step ?. skip s ?. first OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġstate . value . value ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisIn Optional Range ( value , Ġskip . min , Ġskip . max ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . emit ( Scale Events . Skip ( getResult (), Ġskip . target ). to UI Event ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . emit ( Scale Events . Next ( getResult ()). to UI Event ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ--- Ġresult Ġ--- Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġget Result (): ĠSingle Int Answer Result ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġstate . value . step ĊĠĠĠĠĠĠĠ Ġval Ġanswer Ġ= Ġstate . value . value ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( step Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle Int Answer Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . identifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value . start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ onedDateTime . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . question Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġelse Ġnull ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ--- Ġaction Ġ--- Ġ*/ ĊĊĠĠĠ Ġfun Ġexecute ( action : ĠScale Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScale Action . Set Step Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Safe Ġ{ Ġset Step ( action . step ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScale Action . Select Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Safe Ġ{ Ġselect Value ( action . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScale Action . Next Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Safe Ġ{ Ġcheck Skip () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScale Action . End Value Selection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Safe Ġ{ Ġsnap Value () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }