Ċ Ċ package Ġcom . example . android . track mys leep quality . sleep tracker Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle .* Ċ 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 .* Ċ Ċ /** Ċ Ġ* ĠViewModel Ġfor ĠSleep Tracker Fragment . Ċ Ġ*/ Ċ class ĠSleep Tracker ViewModel ( ĊĠĠĠĠĠĠĠ Ġval Ġdatabase : ĠSleep Database Dao , ĊĠĠĠĠĠĠĠ Ġapplication : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĊĊĠĠĠ Ġprivate Ġvar ĠviewModel Job Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠviewModel Job ) ĊĠĠĠ Ġprivate Ġvar Ġton ight Ġ= ĠMutable LiveData < Sleep Night ?> () ĊĠĠĠ Ġpublic Ġval Ġn ights Ġ= Ġdatabase . getAll N ights () ĊĊĠĠĠ Ġval Ġnight String Ġ= ĠTransform ations . map ( n ights ){ Ġn ights Ġ-> ĊĠĠĠĠĠĠĠ Ġformat N ights ( n ights , Ġapplication . resources ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// if Ġton ight Ġis Ġnull Ġthen Ġstart Ġshould Ġbe Ġvisible ĊĠĠĠ Ġval Ġstart Button Visible Ġ= ĠTransform ations . map ( ton ight ){ ĊĠĠĠĠĠĠĠ Ġnull Ġ== Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// if Ġton ight Ġhas Ġa Ġvalue Ġthen Ġstop Ġbutton Ġshould Ġbe Ġvisible ĊĠĠĠ Ġval Ġstop Button Visible Ġ= ĠTransform ations . map ( ton ight ){ ĊĠĠĠĠĠĠĠ Ġnull Ġ!= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// if Ġthere Ġare Ġn ights , Ġthen Ġonly Ġclear Ġbutton Ġshould Ġbe Ġvisible ĊĠĠĠ Ġ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 ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Sleep Quality Ġ= ĠMutable LiveData < Sleep Night >() ĊĠĠĠ Ġval Ġnavigate To Sleep Quality Ġ: ĠLive Data < Sleep Night > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To Sleep Quality ĊĊĠĠĠ Ġfun Ġdone Navigation () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Sleep Quality . value Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize T on ight () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize T on ight () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// This Ġwill Ġlaunch Ġthe Ġcoroutine Ġwithout Ġdist ur bing Ġthe Ġmain thread Ġinto Ġcontext Ġdefined Ġby Ġthe Ġscope ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġton ight . value Ġ= Ġget T on ight From D atab se () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// We Ġwant Ġto Ġmake Ġsure Ġthat Ġit Ġdoes Ġnot Ġblock Ġand Ġreturns Ġsleep Night Ġor Ġnull ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget T on ight From D atab se (): ĠSleep Night ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnight Ġ= Ġdatabase . getT on ight () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// start Ġtime Ġand Ġend Ġtime Ġare Ġthe Ġsame Ġthen Ġwe Ġknow Ġthat Ġwe Ġare Ġcontinuing Ġwith Ġexisting Ġnight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( night ?. endTime Milli Ġ!= Ġnight ?. startTime Milli ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnight Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnight ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Click ĠHandler Ġfor Ġstart Ġtracking ĊĠĠĠ Ġfun ĠonStart Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// we Ġare Ġdoing Ġthis Ġin Ġui Ġscope Ġbecause Ġwe Ġneed Ġit Ġto Ġupdate Ġthe ĠUI ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Night Ġ= ĠSleep Night () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( new Night ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġton ight . value Ġ= Ġget T on ight From D atab se () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert ( night : ĠSleep Night ){ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . insert ( night ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // Format Ġto Ġwrite Ġfunctions Ċ // ĠĠĠ Ġfun Ġsome Work Need sTo Be Done { Ċ // ĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Function () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġprivate Ġsuspend Ġfun Ġsuspend Function () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlong Running Work () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} ĊĊĊĊ ĊĊĠĠĠ Ġ// Click ĠHandler Ġfor Ġstop Ġtracking ĊĠĠĠ Ġfun Ġon Stop Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ show Sn ackBar Event . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ ĠviewModel Job . cancel () ĊĠĠĠ Ġ} Ċ } ĊĊ