package Ġxyz . team gravity . bluetooth chat . arch Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . le .* Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġxyz . team gravity . bluetooth chat . helper . constants . SERVICE _ UUID Ċ import Ġxyz . team gravity . bluetooth chat . helper . extension . log Ċ import Ġxyz . team gravity . bluetooth chat . helper . util . Device Scan ViewState Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Device Scan ViewModel " Ċ Ċ // Ġ 3 0 Ġsecond Ġscan Ġperiod Ċ private Ġconst Ġval ĠSC AN _ PERIOD Ġ= Ġ 3 0 _ 0 0 0 L Ċ Ċ class ĠDevice Scan ViewModel ( app : ĠApplication ) Ġ: ĠAndroid ViewModel ( app ) Ġ{ ĊĊĠĠĠ Ġ// Ġli ved ata Ġfor Ġsending Ġthe Ġview Ġstate Ġto Ġthe ĠDevice Scan Fragment ĊĠĠĠ Ġprivate Ġval Ġ_ view State Ġ= ĠMutable LiveData < Device Scan ViewState >() ĊĠĠĠ Ġval Ġview State Ġ= Ġ_ view State Ġas ĠLive Data < Device Scan ViewState > ĊĊĠĠĠ Ġ// ĠString Ġkey Ġis Ġthe Ġaddress Ġof Ġthe Ġbluetooth Ġdevice ĊĠĠĠ Ġprivate Ġval Ġscan Results Ġ= Ġmutable Map Of < String , ĠBluetooth Device >() ĊĊĠĠĠ Ġ// ĠBluetooth Adapter Ġshould Ġnever Ġbe Ġnull Ġsince ĠBLE Ġis Ġrequired Ġper ĊĠĠĠ Ġ// Ġthe Ġ< uses - feature > Ġtag Ġin Ġthe ĠAndroid Manifest . xml ĊĠĠĠ Ġprivate Ġval Ġadapter : ĠBluetooth Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĊĠĠĠ Ġ// ĠThis Ġproperty Ġwill Ġbe Ġnull Ġif Ġbluetooth Ġis Ġnot Ġenabled ĊĠĠĠ Ġprivate Ġvar Ġscanner : ĠBluetooth Le Scanner ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġscan Callback : ĠDevice Scan Callback ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġscan Filters : ĠList < Scan Filter > ĊĠĠĠ Ġprivate Ġval Ġscan Settings : ĠScan Settings ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġscan Ġfilters Ġand Ġsettings ĊĠĠĠĠĠĠĠ Ġscan Filters Ġ= Ġbuild Scan Filters () ĊĠĠĠĠĠĠĠ Ġscan Settings Ġ= Ġbuild Scan Settings () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġa Ġscan Ġfor ĠBLE Ġdevices ĊĠĠĠĠĠĠĠ Ġstart Scan () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġstop Sc anning () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġad vertisement Ġis Ġnot Ġsupported Ġon Ġthis Ġdevice Ġthen Ġother Ġdevices Ġwill Ġnot Ġbe Ġable Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġdiscover Ġand Ġconnect Ġto Ġit . ĊĠĠĠĠĠĠĠ Ġif Ġ(! adapter . is Multiple Ad vertisement Supported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠDevice Scan ViewState . Ad vertisement NotSupported ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( scan Callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscanner Ġ= Ġadapter . bluetooth Le Scanner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" Start ĠSc anning ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe ĠUI Ġto Ġindicate Ġan Ġactive Ġscan Ġis Ġstarting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠDevice Scan ViewState . Active Scan ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġscanning Ġafter Ġthe Ġscan Ġperiod ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( SCAN _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Sc anning () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠK ick Ġoff Ġa Ġnew Ġscan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Callback Ġ= ĠDevice Scan Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscanner ?. start Scan ( scan Filters , Ġscan Settings , Ġscan Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" Already Ġscanning ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Sc anning () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" Stopping ĠSc anning ") ĊĠĠĠĠĠĠĠ Ġscanner ?. stop Scan ( scan Callback ) ĊĠĠĠĠĠĠĠ Ġscan Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġreturn Ġthe Ġcurrent Ġresults ĊĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠDevice Scan ViewState . Scan Results ( scan Results ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa ĠList Ġof Ġ[ Scan Filter ] Ġobjects Ġto Ġfilter Ġby ĠService ĠUUID . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Scan Filters (): ĠList < Scan Filter > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠScan Filter . Builder () ĊĠĠĠĠĠĠĠ Ġ// ĠComment Ġout Ġthe Ġbelow Ġline Ġto Ġsee Ġall ĠBLE Ġdevices Ġaround Ġyou ĊĠĠĠĠĠĠĠ Ġbuilder . set Service Uuid ( Parcel Uuid ( SERVICE _ UUID )) ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġ[ Scan Settings ] Ġobject Ġset Ġto Ġuse Ġlow Ġpower Ġ( to Ġpreserve Ġbattery Ġlife ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Scan Settings (): ĠScan Settings Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠScan Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ POWER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCustom ĠScan Callback Ġobject Ġ- Ġadds Ġfound Ġdevices Ġto Ġlist Ġon Ġsuccess , Ġdisplays Ġerror Ġon Ġfailure . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠDevice Scan Callback Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Batch Scan Results ( results : ĠList < Scan Result >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Batch Scan Results ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġresults ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . device ?. let Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Results [ device . address ] Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠDevice Scan ViewState . Scan Results ( scan Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . device ?. let Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Results [ device . address ] Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠDevice Scan ViewState . Scan Results ( scan Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Failed ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Failed ( errorCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġerror Ġstate Ġto Ġthe Ġfragment Ġto Ġdisplay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" Scan Ġfailed Ġwith Ġerror : Ġ$ errorCode " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠDevice Scan ViewState . Error ( errorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }