package Ġcom . ste le ot . sample . ui . main Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ste le ot . ble kotlin . B le Client Ċ import Ġcom . ste le ot . ble kotlin . B le Scan Result Ċ import Ġcom . ste le ot . ble kotlin . status . B le Status Ċ import Ġcom . ste le ot . sample . ui . utils . Event Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠMain ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ results Ġ= ĠMutable LiveData < List < B le Scan Result With Selected >>() ĊĠĠĠ Ġval Ġresults : ĠLive Data < List < B le Scan Result With Selected >> Ġ= Ġ_ results ĊĊĠĠĠ Ġprivate Ġval Ġ_ bluetooth Enabled Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġbluetooth Enabled : ĠLive Data < Boolean > Ġ= Ġ_ bluetooth Enabled ĊĊĠĠĠ Ġprivate Ġval Ġ_ goTo Details Ġ= ĠMutable LiveData < Event < B le Scan Result With Selected >>() ĊĠĠĠ Ġval Ġgo To Details : ĠLive Data < Event < B le Scan Result With Selected >> Ġ= Ġ_ goTo Details ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB le Client . status . collect Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Not Started Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Not Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Bluetooth Not Available Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bluetooth Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . B le NotSupported Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" B le Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Bluetooth Permission Not Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bluetooth Ġpermission Ġnot Ġgranted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Bluetooth Admin Permission Not Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bluetooth Ġadmin Ġpermission Ġnot Ġgranted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Bluetooth Not Enabled Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bluetooth Ġnot Ġenabled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ bluetooth Enabled . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Location Permission Not Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Location ĠPermission Ġnot Ġgranted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Bluetooth Was Closed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bluetooth Ġwas Ġclosed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ bluetooth Enabled . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB le Status . Bluetooth Was Enabled Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bluetooth Ġwas Ġenabled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ bluetooth Enabled . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Sc anning () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB le Client . get Stored Device (). collect Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le Client . start B le Scan Multiple ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġadd Ġfilters Ġif Ġneeded . ĠThe Ġbelow Ġis Ġan Ġexample Ġof Ġheart Ġrate Ġsearch */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le Scan Filter Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Service Uuid ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParcel Uuid . fromString ( B le Gatt Service Uuid s . HE ART _ RATE . to Bluetooth Uuid String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). collect Ġ{ Ġresults Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ results . value Ġ= Ġresults . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġ( it . device . address Ġ== Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Sc anning () Ġ{ ĊĠĠĠĠĠĠĠ ĠB le Client . stop B le Scan () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Device ( ĊĠĠĠĠĠĠĠ Ġitem : ĠB le Scan Result With Selected ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ goTo Details . value Ġ= ĠEvent ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Sc anning () ĊĠĠĠ Ġ} Ċ } Ċ Ċ type alias ĠB le Scan Result With Selected Ġ= ĠPair < B le Scan Result , ĠBoolean > Ċ