package Ġcom . motion apps . sensor box . fragments Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . hardware . Sensor Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget .* Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . Nav Directions Ċ import Ġandroidx . navigation . Navigation Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . motion apps . sensor box . activities . Measurement Activity Ċ import Ġcom . motion apps . sensor box . R Ċ import Ġcom . motion apps . sensor box . types . Sensor Resources Ċ import Ġcom . motion apps . sensor box . permissions . Permission Handler Ċ import Ġcom . motion apps . sensor box . ui Handlers . Sensor View Handler Ċ import Ġcom . motion apps . sensor box . ui Handlers . Storage Functions Ċ import Ġcom . motion apps . sensor box . view models . Main ViewModel Ċ import Ġcom . motion apps . sensor services . services . Measurement Service Ċ import Ġcom . motion apps . sensor services . types . Sensor Needs Ċ import Ġcom . motion apps . sensor services . types . Sensor Needs . Companion . get Sensor ById W ear Os Ċ import Ġcom . motion apps . sensor services . types . Sensor Needs . Companion . getS ensors Ċ import Ġcom . motion apps . we ar os lib . W ear Os States Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġes . dm oral . toast y . Toast y Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Internal Cor outines Api ĊĊ Ċ /** Ċ Ġ* ĠMain Ġfragment Ġto Ġchoose Ġsensors Ġand Ġpicking Ġthem Ġto Ġmeasure Ċ Ġ*/ Ċ Ċ @ Experimental Cor outines Api Ċ @ Internal Cor outines Api Ċ @ Android EntryPoint Ċ open Ġclass ĠHome Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcontainer : ĠLinearLayout ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmain Button : ĠButton ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġdialog : ĠMaterial Dialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġwe ar Os Views : ĠArrayList < View > Ġ= ĠArrayList () Ġ// Ġstoring ĠW ear ĠOs Ġviews Ġ- Ġcan Ġbe Ġdeleted ĊĠĠĠ Ġprivate Ġval Ġmain ViewModel : ĠMain ViewModel Ġby Ġview Models ( owner Producer Ġ= Ġ{ Ġrequire Activity () Ġ}) ĊĠĠĠ Ġprotected Ġvar Ġpermission Handler : ĠPermission Handler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġwe ar Shown Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġpermission Handler Ġ= ĠPermission Handler ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġroot : ĠView Ġ= Ġinflater . inflate ( R . layout . fragment _ home , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġthis . container Ġ= Ġroot . findViewById ( R . id . home _ container ) ĊĠĠĠĠĠĠĠ Ġthis . main Button Ġ= Ġroot . findViewById ( R . id . home _ main button ) ĊĊĠĠĠĠĠĠĠ Ġinit Sensor Views ( in flater ) ĊĠĠĠĠĠĠĠ Ġinit GPS View ( in flater ) ĊĠĠĠĠĠĠĠ Ġcheck Sensors To Measure () ĊĠĠĠĠĠĠĠ Ġinit Main Button () ĊĠĠĠĠĠĠĠ Ġset Observer s ( in flater ) ĊĠĠĠĠĠĠĠ Ġmain ViewModel . clear Handlers () ĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠStorage Functions . check Main Folder ( require Context (), Ġrequire View ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġif Ġthe ĠW ear ĠOs Ġsensors Ġare Ġavailable Ġ- Ġshow Ġthem ĊĠĠĠĠ Ġ* ĠOtherwise Ġremove Ġthem , Ġif Ġthey Ġare Ġavailable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Observer s ( in flater : ĠLayoutInflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ViewModel . we ar Os Contact ed . observe ( require Activity (), Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate W ear Views ( info , Ġinflater ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove W ear Os () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG athers Ġall Ġthe Ġsensors , Ġinfl ates Ġviews Ġand Ġmanages Ġbuttons ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Sensor Views ( in flater : ĠLayoutInflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsensors Needs : ĠArrayList < Sensor Needs > Ġ= ĠgetS ensors ( require Context ()) ĊĠĠĠĠĠĠĠ Ġval Ġimage Buttons : ĠArrayList < Image Button > Ġ= Ġinf late Sensors Views ( sensors Needs , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġval Ġsensor View Handler : ĠSensor View Handler Ġ= Ġmain ViewModel . get Sensor View () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġimage Buttons . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandling Ġthe Ġbutton Ġto Ġadd Ġor Ġremove Ġto Ġsensor Ġfor Ġmeasurement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsensor View Handler Ġmanages Ġall Ġsensors Ġto Ġmeasure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Buttons [ i ]. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Handler ?. let Ġ{ Ġpermission Handler Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permission Handler . check Heart Rate Sensor ( this , Ġsensors Needs [ i ]. id Ġ )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor View Handler . sensors To Record [ sensors Needs [ i ]. id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! sensor View Handler . sensors To Record [ sensors Needs [ i ]. id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor View Handler . sensors To Record [ sensors Needs [ i ]. id ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Buttons [ i ]. setImage Resource ( R . drawable . ic _ ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Buttons [ i ]. setImage Resource ( R . drawable . ic _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Sensors To Measure () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġrefresh Ġreasons Ġ- Ġbutton Ġis Ġupdated Ġby Ġsensor View Handler Ġfrom ĠViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor View Handler . sensors To Record [ sensors Needs [ i ]. id ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Buttons [ i ]. setImage Resource ( R . drawable . ic _ ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Buttons [ i ]. setImage Resource ( R . drawable . ic _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNext Ġstep Ġof Ġinfl ation Ġof Ġthe Ġview Ġ- Ġbuttons Ġare Ġgather ed , Ġbecause Ġthey Ġneed Ġto Ġbe Ġconfigured ĊĠĠĠĠ Ġ* Ġ@ param Ġsensors Needs Ġ- Ġlist Ġof Ġall Ġavailable Ġsensors Ġ- ĠSensor Needs Ġobjects ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġbuttons ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinf late Sensors Views ( ĊĠĠĠĠĠĠĠ Ġsensors Needs : ĠArrayList < Sensor Needs >, ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater ĊĠĠĠ Ġ): ĠArrayList < Image Button > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsensor Buttons : ĠArrayList < Image Button > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( sensor Needs : ĠSensor Needs Ġin Ġsensors Needs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinf late One Sensor ( sensor Needs , Ġinflater , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Buttons . add ( view . findViewById ( R . id . sensor row _ save )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsensor Buttons ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġinfl ates Ġone Ġsensor Ġto ĠLinearLayout Ġ- Ġused Ġfor Ġthe ĠPhone Ġsensors Ġand ĠW ear ĠOs Ġsensors ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsensor Needs Ġ- Ġrequirements Ġfor Ġthe Ġsensor ĊĠĠĠĠ Ġ* Ġ@ param Ġwe ar Os Ġ- Ġif Ġthe Ġview Ġbelongs Ġto ĠW ear ĠOs ĊĠĠĠĠ Ġ* Ġ@ return Ġ- Ġcreated Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinf late One Sensor ( ĊĠĠĠĠĠĠĠ Ġsensor Needs : ĠSensor Needs , ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġwe ar Os : ĠBoolean ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Name Ġ= Ġsensor Needs . name ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= ĠSensor Resources . valueOf ( resourceName ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . item _ layout _ sensor row , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġicon : ĠImageView Ġ= Ġview . findViewById ( R . id . sensor row _ icon ) ĊĠĠĠĠĠĠĠ Ġval ĠtextView : ĠTextView Ġ= Ġview . findViewById ( R . id . sensor row _ info _ title ) ĊĊĠĠĠĠĠĠĠ Ġicon . setImage Resource ( resources . icon ) ĊĠĠĠĠĠĠĠ ĠtextView . setText ( resources . title ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Button : ĠImage Button Ġ= Ġview . findViewById ( R . id . sensor row _ info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( we ar Os ) Ġ{ Ġ// ĠW ear ĠOs Ġhas Ġits Ġown Ġdisplay er ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor Needs . id Ġ== ĠSensor . TYPE _ HE ART _ RATE Ġ&& Ġmain ViewModel . is Heart Rate Permission Required ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Ġ= Ġmain ViewModel . show Dialog For He ar Rate Permission W ear Os ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction : ĠNav Directions Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHome Fragment Directions . action Nav Home To Nav W ear Os Info ( resourceName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . find Nav Controller ( require View ()). navigate ( action ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Handler ?. let Ġ{ Ġpermission Handler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Handler . check Heart Rate Sensor ( this , Ġsensor Needs . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction : ĠNav Directions Ġ= ĠHome Fragment Directions . home Info Action ( resourceName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . find Nav Controller ( require View ()). navigate ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontainer ?. addView ( view ) ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthe ĠGPS Ġis Ġavailable , Ġthen Ġit Ġis Ġadded Ġto Ġsensors ĊĠĠĠĠ Ġ* ĠHas Ġits Ġown Ġplace Ġamong Ġthe Ġsen ors ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit GPS View ( in flater : ĠLayoutInflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( require Activity (). package Manager . has System Feature ( PackageManager . FEATURE _ LOCATION _ GPS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġpermission Ġis Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor View Handler Ġ= Ġthis . main ViewModel . get Sensor View () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . item _ layout _ sensor row , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon : ĠImageView Ġ= Ġview . findViewById ( R . id . sensor row _ icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView : ĠTextView Ġ= Ġview . findViewById ( R . id . sensor row _ info _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Button : ĠImage Button Ġ= Ġview . findViewById ( R . id . sensor row _ save ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Button : ĠImage Button Ġ= Ġview . findViewById ( R . id . sensor row _ info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Handler ?. let Ġ{ Ġpermission Handler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! permission Handler . check GPS Permission ( this )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction : ĠNav Directions Ġ= ĠHome Fragment Directions . home Info Action ( Sensor Needs . GPS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . find Nav Controller ( require View ()). navigate ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon . setImage Resource ( R . drawable . ic _ gps ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setText ( R . string . gps ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor View Handler . gps Measurement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Handler ?. let Ġ{ Ġpermission Handler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! permission Handler . check GPS Permission ( this )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor View Handler . gps Measurement Ġ= Ġ! sensor View Handler . gps Measurement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor View Handler . gps Measurement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Sensors To Measure () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer ?. addView ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIn its Ġall Ġthe Ġchecks Ġbefore Ġmeasurement Ġtakes Ġplace Ġand Ġsends Ġthe ĠMeasurement Service Ġintent ĊĠĠĠĠ Ġ* Ġto Ġstart Ġservice Ġand ĠMeasurement Activity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġinit Main Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Button ?. setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permission Handler Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Storage Functions . check Storage Access ( this , Ġpermission Handler !! )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġmain ViewModel . we ar Os Status . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġis ĠW ear Os States . Status ) Ġ{ Ġ// Ġstops , Ġif Ġthe Ġwe ar Ġos Ġis Ġmeas uring ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status . running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . we ar _ os _ active ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġintent , Ġsensors Ġgather ing Ġand Ġfolder Ġgeneration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Intent Ġ= ĠIntent ( require Context (), ĠMeasurement Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor ViewModel Ġ= Ġmain ViewModel . get Sensor View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Name Ġ= ĠMeasurement Service . generate Folder Name ( Measurement Service . END LESS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠW ear ĠOs Ġ- Ġsends Ġmessage Ġto ĠW ear able Ġto Ġstart Ġmeasurement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwe ar Os Sensors Ġ= Ġmain ViewModel . get Sensor View (). get W ear Os To Measure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwe ar Os Sensors ?. let Ġ{ Ġsensors Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . start W ear Os Measurement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasurement Service . add Extra To Intent Basic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Intent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġ// Ġfalse Ġ- ĠPhone Ġstorage , Ġtrue Ġ- ĠW ear able Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor ViewModel . getS ensors To Measure (), Ġ// Ġphone Ġsensors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor ViewModel . gps Measurement , Ġ// ĠGPS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwe ar Os Sensors Ġ// ĠW ear ĠOs Ġsensors Ġ- Ġcan Ġbe Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). finish () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( require Context (), ĠMeasurement Activity :: class . java ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put Extras ( service Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( require Context (), Ġservice Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġremove W ear Os () ĊĊĠĠĠĠĠĠĠ Ġpermission Handler ?. on Destroy () ĊĊĠĠĠĠĠĠĠ Ġdialog ?. dismiss () ĊĠĠĠĠĠĠĠ Ġdialog Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcontainer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmain Button Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġremove W ear Os () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMakes Ġmain Ġbutton Ġavailable , Ġif Ġthere Ġis Ġsensor Ġto Ġmeasure ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Sensors To Measure () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( main ViewModel . get Sensor View (). is Something To Measure ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button ?. alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button ?. is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button ?. isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button ?. alpha Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button ?. is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button ?. isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠW EAR ĠOS ĠV IE WS ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġinf late Ġviews Ġfor Ġthe ĠW ear ĠOs ĊĠĠĠĠ Ġ* Ġdata Ġare Ġobtained Ġfrom ĠEnumeration Ġof Ġbasic Ġsensor ĊĠĠĠĠ Ġ* Ġ@ param Ġinfo Ġ- Ġhash Map Ġ< if Ġof Ġthe Ġsensor , Ġlist Ġwith Ġattributes > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate W ear Views ( info : ĠHashMap < Int , ĠList < String >>, Ġinflater : ĠLayoutInflater ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( we ar Os Views . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove W ear Os () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsensor View Handler : ĠSensor View Handler Ġ= Ġmain ViewModel . get Sensor View () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġinfo . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġinfo [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor Needs Ġ= Ġget Sensor ById W ear Os ( properties ! ![ 0 ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinf late One Sensor ( sensor Needs , Ġinflater , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwe ar Os Views . add ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor View Handler . add W ear Os Sensor ( sensor Needs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandling Ġthe Ġbutton Ġto Ġadd Ġor Ġremove Ġto Ġsensor Ġfor Ġmeasurement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsensor View Handler Ġmanages Ġall Ġsensors Ġto Ġmeasure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġspecific Ġobject Ġfor ĠW ear ĠOs Ġsensors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Button Ġ= Ġview . findViewById < Image Button >( R . id . sensor row _ save ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor Needs . id Ġ== ĠSensor . TYPE _ HE ART _ RATE Ġ&& Ġmain ViewModel . is Heart Rate Permission Required ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Ġ= Ġmain ViewModel . show Dialog For He ar Rate Permission W ear Os ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor View Handler . sensors W ear Os To Record [ sensor Needs . id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! sensor View Handler . sensors W ear Os To Record [ sensor Needs . id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor View Handler . sensors W ear Os To Record [ sensor Needs . id ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Sensors To Measure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġrefresh Ġreasons Ġ- Ġbutton Ġis Ġupdated Ġby Ġsensor View Handler Ġfrom ĠViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor View Handler . sensors W ear Os To Record [ sensor Needs . id ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Button . setImage Resource ( R . drawable . ic _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġremoves ĠW ear Os Ġviews ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove W ear Os () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġwe ar Os Views ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer ?. remove View ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwe ar Os Views . clear () ĊĠĠĠĠĠĠĠ Ġwe ar Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcheck Sensors To Measure () ĊĠĠĠ Ġ} Ċ Ċ }