package Ġorg . covid watch . android . ui Ċ Ċ import Ġandroid . Manifest . permission .* Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . work .* Ċ import Ġorg . covid watch . android . R Ċ import Ġorg . covid watch . android . ble . Bluetooth ManagerImpl Ċ import Ġorg . covid watch . android . data . Bluetooth ViewModel Ċ import Ġorg . covid watch . android . data . Contact Event Ċ import Ġorg . covid watch . android . data . Contact Event DAO Ċ import Ġorg . covid watch . android . data . Cov id Watch Database Ċ import Ġorg . covid watch . android . data . contact event . Contact Events Download Worker Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbluetooth Adapter : ĠBluetooth Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvm : ĠBluetooth ViewModel ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġvm Ġ= ĠViewModel Provider ( this ). get ( Bluetooth ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ# 1 5 : ĠCOMMENT ING ĠOUT ĠBE CA USE ĠUSING ĠE MUL ATOR ĊĠĠĠĠĠĠĠ Ġ// ĠBR ING ĠBACK ĠAFTER ĠMER GING ĠUX ĠFIRST ĠRUN ĊĠĠĠĠĠĠĠ Ġ// ĠREMOVE Ġadding Ġexample ĠC EN ĊĠĠĠĠĠĠĠ Ġinit Bluetooth Adapter () ĊĠĠĠĠĠĠĠ ĠLog . i (" test ", Ġ" did Ġwe Ġmake Ġit Ġhere ?") ĊĠĠĠĠĠĠĠ Ġadd Dummy C EN () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġrefresh Public Contact Events () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġadd Dummy C EN () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc en Ġ= ĠBluetooth ManagerImpl . Default C en Generator (). generate () ĊĠĠĠĠĠĠĠ ĠLog . i (" test ", Ġ" how Ġabout Ġhere ?") ĊĠĠĠĠĠĠĠ ĠLog . i (" C EN ĠBO I ", Ġc en . data . toString ()) ĊĠĠĠĠĠĠĠ ĠC ov id Watch Database . database Write Executor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdao : ĠContact Event DAO Ġ= ĠC ov id Watch Database . getInstance ( this ). contact Event DAO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Event Ġ= ĠContact Event ( c en . data . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis CurrentUser S ick Ġ= Ġthis . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . getString ( R . string . preference _ file _ key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). getBoolean ( this . getString ( R . string . preference _ is _ current _ user _ s ick ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact Event . was Pot entially Inf ect ious Ġ= Ġis CurrentUser S ick ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert ( contact Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Contact Event Logging ( enabled : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= Ġthis ?. application Context Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġshared Pref Ġ= Ġapplication . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . getString ( R . string . preference _ file _ key ), ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġwith ( shared Pref . edit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . getString ( org . covid watch . android . R . string . preference _ is _ contact _ event _ logging _ enabled ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Public Contact Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= ĠConstraints . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Requires Ch arging ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Network Type . CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġdownload Request Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOne Time Work RequestBuilder < Contact Events Download Worker >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Constraints ( constraints ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( this ). enqueue Unique Work ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact Events Download Worker . WORK ER _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExisting Work Policy . REPLACE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Request ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe ĠBluetooth Adapter . ĠManifest Ġfile Ġis Ġalready Ġsetup Ġto Ġallow Ġbluetooth Ġaccess . ĊĠĠĠĠ Ġ* ĠThe Ġuser Ġwill Ġbe Ġasked Ġto Ġenable Ġbluetooth Ġif Ġit Ġis Ġturned Ġoff ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Bluetooth Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġbluetooth Adapter Ġ= Ġ( getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ). adapter ĊĠĠĠĠĠĠĠ Ġ// ĠEns ures ĠBluetooth Ġis Ġavailable Ġon Ġthe Ġdevice Ġand Ġit Ġis Ġenabled . ĠIf Ġnot , ĊĠĠĠĠĠĠĠ Ġ// Ġdisplays Ġa Ġdialog Ġrequesting Ġuser Ġpermission Ġto Ġenable ĠBluetooth . ĊĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Bt Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( enable Bt Intent , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe ĠLocation ĠManager Ġused Ġto Ġobtain Ġco arse Ġbluetooth / wifi Ġlocation ĊĠĠĠĠ Ġ* Ġand Ġfine ĠGPS Ġlocation , Ġlogged Ġon Ġa Ġcontact Ġevent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO Ġadd ĠGPS Ġinitialization Ġhere , Ġfor Ġnow Ġwe Ġjust Ġask Ġfor Ġlocation Ġpermissions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠLOC ATION _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠ Ġfun Ġinit Location Manager () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Status Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( permission Status ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED Ġ-> Ġvm . permission Request Result LiveData . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ DEN IED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( this , ACCESS _ F INE _ LOCATION )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . ble _ location _ permission ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠIf Ġa Ġuser Ġselects Ġ" Don 't Ġask Ġagain " Ġthe Ġfunction Ġbelow Ġdoes Ġnot Ġshow Ġthe Ġsystem Ġdialogue . Ġ ĠThis Ġprevents Ġthe Ġuser Ġfrom Ġever Ġprogress ing . ĠMaybe Ġthis Ġis Ġan ĠOK ĠUX ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermissions Ġ= ĠarrayOf ( ACCESS _ CO AR SE _ LOCATION , ACCESS _ F INE _ LOCATION , ACCESS _ BACKGROUND _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , Ġpermissions , ĠLOC ATION _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Contact Event Logging ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm . permission Request Result LiveData . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} // Ignore Ġall Ġother Ġrequests ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ