/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 , ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . example . android . track mys leep quality . sleep tracker Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġcom . example . android . track mys leep quality . database . Sleep Database Dao Ċ import Ġcom . example . android . track mys leep quality . database . Sleep Night Ċ import Ġcom . example . android . track mys leep quality . format N ights Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ Ċ /** Ċ Ġ* ĠViewModel Ġfor ĠSleep Tracker Fragment . Ċ Ġ*/ ĊĊĊĠĠ Ġclass ĠSleep Tracker ViewModel ( val Ġdatabase : ĠSleep Database Dao , ĊĠĠĠĠĠĠĠ Ġapplication : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ Ċ Ċ private Ġval Ġ_ navigate To Sleep Detail Ġ= ĠMutable LiveData < Long >() ĊĠĠĠ Ġval Ġnavigate to Sleep Detail ĊĠĠĠ Ġget () Ġ= Ġ_ navigate To Sleep Detail ĊĊĠĠĠ Ġ/* job Ġallows Ġyou Ġto Ġcancel Ġall Ġcor outines Ġstarted Ġby Ġthis ĠViewModel ĊĠĠĠ Ġwhen ĠviewModel Ġis Ġdestroyed */ ĊĠĠĠ Ġprivate Ġvar ĠviewModel Job Ġ= ĠJob () ĊĊĊĠ Ġ/* Ġdefining ĠCor outine Scope ( context ) Ġ- ĠA Ġscope Ġcombin es Ġinformation Ġabout Ġa ĊĠĠ Ġcoroutine 's Ġjob Ġand Ġdispatcher . Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠviewModel Job ) ĊĊĊĊĊĊĊĊ Ċ // getting Ġall Ġn ights Ġfrom Ġthe Ġdatabase ĊĊĠĠ Ġval Ġn ights Ġ= Ġdatabase . getAll N ights () ĊĊĠĠĠ Ġ// formatting Ġthe ĠNight Ġobject Ġreference Ġusing Ġthe ĠUtil ĊĊĠĠĠ Ġval Ġnight String Ġ= ĠTransform ations . map ( n ights ){ ĊĊĠĠĠĠĠĠĠ Ġn ights Ġ-> Ġformat N ights ( n ights , Ġapplication . resources ) ĊĠĠĠ Ġ} ĊĊ Ċ private Ġval Ġton ight Ġ= ĠMutable LiveData < Sleep Night >() ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize T on ight () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize T on ight () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġton ight . value Ġ= Ġget T on ight From Database () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget T on ight From Database (): ĠSleep Night ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ Ġwith Context ( IO ){ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnight Ġ= Ġdatabase . getT on ight () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( night ?. endTime Milli != night ?. startTime Milli ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnight Ġ= null ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnight ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// click Ġhandler Ġfor ĠStart ĠButton ĊĠĠ Ġfun ĠonStart Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Night Ġ= ĠSleep Night () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( new Night ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġton ight . value Ġ= Ġget T on ight From Database () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert ( night : Sleep Night ){ ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . insert ( night ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Click ĠHandler Ġfor ĠStop ĠButton ĊĊĠĠĠ Ġfun Ġon Stop Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// spec ifies Ġthe Ġfx n Ġfrom Ġwhich Ġthis Ġstatement Ġreturns Ġamong st Ġthe Ġseveral Ġnested Ġfx ns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Night Ġ= Ġton ight . value Ġ?: Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Night . endTime Milli Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( old Night ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ navigate To Sleep Quality . value Ġ= old Night ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate ( night : ĠSleep Night ){ ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . update ( night ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Click ĠHandler Ġfor ĠClear ĠButton ĊĊĠĠĠ Ġfun Ġon Clear () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġton ight . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġclear (){ ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO Ġ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ show Sn ackBar Event . value = Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Sleep Quality Ġ= ĠMutable LiveData < Sleep Night >() ĊĠĠĠĠĠĠĠ Ġval Ġnavigate To Sleep Quality Ġ: LiveData < Sleep Night > ĊĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ_ navigate To Sleep Quality ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġdone Navig ating () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Sleep Quality . value Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġstart Button Visible Ġ= ĠTransform ations . map ( ton ight ){ it == null } ĊĠĠĠ Ġval Ġstop Button Visible Ġ= ĠTransform ations . map ( ton ight ){ it != Ġnull } ĊĠĠĠ Ġval Ġclear Button Visible Ġ= ĠTransform ations . map ( n ights ){ ĊĠĠĠĠĠĠĠ Ġit ?. isNotEmpty () ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġval Ġ_ show Sn ackBar Event Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġshow Sn ackBar Event : ĠLive Data < Boolean > ĊĠĠĠ Ġget () Ġ= Ġ Ġ_ show Sn ackBar Event ĊĊĊĠĠĠ Ġfun Ġdone Showing Sn ackBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ show Sn ackBar Event . value Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// c ancell ing Ġall Ġcor outines Ġwhen ĠViewModel Ġis Ġdestroyed ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĊĠĠĠĠĠĠĠ ĠviewModel Job . cancel () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġon Sleep Night Clicked ( id : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ_ navigate To Sleep Detail . value Ġ= Ġid ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġon Sleep Detail Navig ated () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Sleep Detail . value Ġ= Ġnull ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ