/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠMar o Å¡ ĠÅ ł el eng Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ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 . mar os sel eng . distance measure ments . ui . new measurement Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . net . Network Info Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . net . wifi . Wifi Manager . EXTRA _ NETWORK _ INFO Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . mar os sel eng . distance measure ments .* Ċ import Ġcom . mar os sel eng . distance measure ments . data . Measured Value Ċ import Ġcom . mar os sel eng . distance measure ments . data . Measurement Ċ import Ġcom . mar os sel eng . distance measure ments . data . Measurement Anchor Device Ċ import Ġcom . mar os sel eng . distance measure ments . data . Measurement Type Ċ import Ġkotlinx . coroutines .* Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠW ifi R ss Measurement ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SAMP LING _ RATE Ġ= Ġ 1 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ measurement Progress Ġ= Ġstart With < Measurement Progress >( Measurement Progress . Not Started ) ĊĠĠĠ Ġval Ġmeasurement InProgress : ĠLive Data < Measurement Progress > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ measurement Progress ĊĊĠĠĠ Ġprivate Ġval Ġsingle Results Ġ= ĠMutable LiveData < Measured Value . Factory >() ĊĠĠĠ Ġval Ġmeasured Values Ġ= Ġaccum ulate At Start ( emit While ( single Results ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ measurement Progress . value Ġis ĠMeasurement Progress . Started ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġvar Ġsampling Rate Millis : ĠLong Ġ= ĠDEFAULT _ SAMP LING _ RATE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġif Ġ( value Ġ< Ġ 0 ) ĠDEFAULT _ SAMP LING _ RATE Ġelse Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmeasurement Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġselected Device : ĠMeasurement Anchor Device ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġwifi Receiver : ĠW ifi Receiver ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġcancel Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcancel Ġmeasurement Ġ( if Ġany Ġis Ġrunning ) Ġand Ġdelete Ġrecord Ġfrom ĠDB ĊĠĠĠĠĠĠĠ Ġif Ġ(_ measurement Progress . value Ġis ĠMeasurement Progress . Started ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ measurement Progress . post Value ( Measurement Progress . Not Started ) ĊĠĠĠĠĠĠĠ Ġstop Scan () ĊĠĠĠĠĠĠĠ Ġselected Device Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Stop Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ(_ measurement Progress . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasurement Progress . Not Started Ġ-> Ġstart Measurement () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasurement Progress . Started Ġ-> Ġstop Measurement And Save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġwhat Ġto Ġdo Ġhere ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretry Save () Ġ{ ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Measurement () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ measurement Progress . value Ġis ĠMeasurement Progress . Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Clicked () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ measurement Progress . post Value ( Measurement Progress . Started ) ĊĠĠĠĠĠĠĠ Ġstart Scan () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Measurement And Save () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Scan () ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġpart Ġof Ġthe Ġpublic ĠAPI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( wifi Receiver Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwifi Receiver Ġ= ĠW ifi Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . register Receiver ( wifi Receiver , ĠIntent Filter ( Wifi Manager . NETWORK _ STATE _ CHANGED _ ACTION )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" wifi Receiver Ġis Ġnot Ġnull , Ġis Ġthis Ġweird ? Ġhow Ġdid Ġthis Ġhappen ?") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġselected Device Ġ= Ġwifi Manager ?. connection Info ?. to Measurement Anchor Device () ĊĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġmeasurement Job ĊĠĠĠĠĠĠĠ Ġif Ġ( job Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( job . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement Job Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Job Ġis Ġnn .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmeasurement Job Ġ= ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġwifi Manager ?. connection Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Results . post Value ( Measured Value . Factory ( info . rssi , ĠSystem . currentTimeMillis ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( sampling Rate Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeasurement Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġmeasurement Job Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ measurement Progress . post Value ( Measurement Progress . Saving ) ĊĠĠĠĠĠĠĠ Ġval Ġmeasurement Ġ= ĠMeasurement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Name Ġ= Ġselected Device ?. name Ġ?: Ġ" ?? ?", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Address Ġ= Ġselected Device ?. address Ġ?: Ġ" ?? ?", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement Type Ġ= ĠMeasurement Type . RSS I , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrequency Ġ= Ġselected Device ?. device Frequency Ġ?: Ġ 2 4 0 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Coroutine ExceptionHandler Ġ{ Ġ_, Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ measurement Progress . post Value ( Measurement Progress . Not Saved ) ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeasurement Id Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Measurement ( measurement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues To Save Ġ= Ġmeasured Values . value ?. map Ġ{ Ġit ()( measurement Id ) Ġ} ?. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values To Save Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Measured Values (* values To Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ measurement Progress . post Value ( Measurement Progress . Saved ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġif Ġ( wifi Receiver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . unregister Receiver ( wifi Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwifi Receiver Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcancel Clicked () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠW ifi Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Hardware Ids ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Network Info Ġ= Ġintent ?. get Parcelable Extra < Network Info >( EXTRA _ NETWORK _ INFO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Conn Info Ġ= Ġwifi Manager ?. connection Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Device Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" Network Ġstate Ġchanged , Ġbut Ġthe Ġselected Ġdevice Ġis Ġnull Ġso Ġdoing Ġnothing .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Device ?. name Ġ!= Ġnew Conn Info ?. ssid Ġ|| Ġselected Device ?. address Ġ!= Ġnew Conn Info ?. mac Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Network Ġstate Ġchanged !\ n New Ġconnection Ġinfo : Ġ% s \ n New Ġnetwork Ġinfo :% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Conn Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Network Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ