package Ġio . blue trace . op entr ace . fragment Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Power Manager Ċ import Ġandroid . text . Sp ann able Ċ import Ġandroid . text . method . Link Movement Method Ċ import Ġandroid . text . style . URL Span Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . core . text . Html Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . google . firebase . remote config . Firebase Remote Config Ċ import Ġcom . google . firebase . remote config . k tx . remote Config Ċ import Ġcom . google . firebase . remote config . k tx . remote Config Settings Ċ import Ġkotlinx . android . synt hetic . main . fragment _ home .* Ċ import Ġpub . dev rel . eas yper missions . After Permission Granted Ċ import Ġpub . dev rel . eas yper missions . Easy Permissions Ċ import Ġio . blue trace . op entr ace .* Ċ import Ġio . blue trace . op entr ace . logging . Central Log Ċ import Ġio . blue trace . op entr ace . on boarding . On boarding Activity Ċ import Ġio . blue trace . op entr ace . status . persistence . Status Record Ċ import Ġio . blue trace . op entr ace . street pass . persistence . Street Pass Record Database Ċ Ċ private Ġconst Ġval ĠREQUEST _ ENABLE _ BT Ġ= Ġ 1 2 3 Ċ private Ġconst Ġval ĠPER MISSION _ REQUEST _ ACCESS _ LOCATION Ġ= Ġ 4 5 6 Ċ Ċ class ĠHome Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Home Fragment " ĊĊĠĠĠ Ġprivate Ġvar Ġm Is Broadcast Listener Registered Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcounter Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremote Config : ĠFirebase Remote Config ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlast Known Sc anning Started : ĠLive Data < Status Record ?> ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġdb Ġ= ĠStreet Pass Record Database . get Database ( view . context ) ĊĊĠĠĠĠĠĠĠ Ġlast Known Sc anning Started Ġ= Ġdb . status Dao (). get Most Recent Record (" Sc anning ĠStarted ") ĊĠĠĠĠĠĠĠ Ġlast Known Sc anning Started . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ last _ update . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ last _ update . text Ġ= Ġ" Last Ġupdated : Ġ${ Utils . getTime ( record . timestamp )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġshow Setup () ĊĊĠĠĠĠĠĠĠ ĠPreference . register Listener ( activity !!. application Context , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġshow Non Empty Anno uncement () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . fragment _ home , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠPreference . register Listener ( activity !!. application Context , Ġlistener ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġshare _ card _ view . setOnClickListener Ġ{ Ġshare This App () Ġ} ĊĠĠĠĠĠĠĠ Ġanimation _ view . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG Ġ&& Ġ++ counter Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġintent Ġ= ĠIntent ( context , ĠP eek Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbtn _ restart _ app _ setup . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġintent Ġ= ĠIntent ( context , ĠOn boarding Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" page ", Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn _ announcement _ close . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear And Hide Anno uncement () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġremote Config Ġ= ĠFirebase . remote Config ĊĠĠĠĠĠĠĠ Ġval Ġconfig Settings Ġ= Ġremote Config Settings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Fetch Interval InSeconds Ġ= Ġ 3 6 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġremote Config . set Config Settings Async ( config Settings ) ĊĠĠĠĠĠĠĠ Ġremote Config . set Defaults Async ( map Of (" Share Text " Ġto ĠgetString ( R . string . share _ message ))) ĊĠĠĠĠĠĠĠ Ġremote Config . fetch And Activate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener ( activity Ġas ĠActivity ) Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Ġ= Ġtask . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCentral Log . d ( TAG , Ġ" Remote Ġconfig Ġfetch Ġ- Ġsuccess : Ġ$ updated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCentral Log . d ( TAG , Ġ" Remote Ġconfig Ġfetch Ġ- Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Show Restart Setup (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( can Request Battery Optimizer Ex emption ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iv _ bluetooth . isSelected Ġ&& Ġiv _ location . isSelected Ġ&& Ġiv _ battery . isSelected ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iv _ bluetooth . isSelected Ġ&& Ġiv _ location . isSelected ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Request Battery Optimizer Ex emption (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& ĠUtils . can Handle Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . get Battery Optimizer Ex emption Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTr acer App . AppContext . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠTr acer App . AppContext . package Manager ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Setup () Ġ{ ĊĠĠĠĠĠĠĠ Ġview _ setup . isVisible Ġ= Ġis Show Restart Setup () ĊĠĠĠĠĠĠĠ Ġview _ complete . isVisible Ġ= Ġ! is Show Restart Setup () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Is Broadcast Listener Registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbluetooth Ġon / off ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġf Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . addAction ( Bluetooth Adapter . ACTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !!. register Receiver ( m Broadcast Listener , Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Broadcast Listener Registered Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// location Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperms Ġ= ĠUtils . get Required Permissions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ location . isSelected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Permissions . has Permissions ( activity Ġas ĠMainActivity , Ġ* perms ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// push Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ push . isSelected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( activity Ġas ĠMainActivity ). are Notifications Enabled () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ bluetooth . isSelected Ġ= Ġ! it . is Disabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// battery Ġignore Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpower Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity Ġas ĠMainActivity ). getSystem Service ( AppCompatActivity . POWER _ SERVICE ) Ġas ĠPower Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġ( activity Ġas ĠMainActivity ). packageName ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbattery _ card _ view . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! power Manager . is Ign oring Battery Optim izations ( packageName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ battery . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCentral Log . d ( TAG , Ġ" Not Ġon ĠB attery ĠOptimization Ġwhitelist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ battery . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCentral Log . d ( TAG , Ġ" On ĠB attery ĠOptimization Ġwhitelist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbattery _ card _ view . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Setup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Is Broadcast Listener Registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !!. unregister Receiver ( m Broadcast Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Broadcast Listener Registered Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ ĠPreference . unregister Listener ( activity !!. application Context , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġlast Known Sc anning Started . remove Observer s ( view Lifecycle Owner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshare This App () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnew Intent Ġ= ĠIntent ( Intent . ACTION _ SEND ) ĊĠĠĠĠĠĠĠ Ġnew Intent . type Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠ Ġnew Intent . putExtra ( Intent . EXTRA _ SUBJECT , ĠgetString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠ Ġvar Ġshare Message Ġ= Ġremote Config . getString (" Share Text ") ĊĠĠĠĠĠĠĠ Ġnew Intent . putExtra ( Intent . EXTRA _ TEXT , Ġshare Message ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( new Intent , Ġ" choose Ġone ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Broadcast Listener : ĠBroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠBluetooth Adapter . ACTION _ STATE _ CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= Ġintent . getInt Extra ( Bluetooth Adapter . EXTRA _ STATE , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠBluetooth Adapter . STATE _ OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ bluetooth . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠBluetooth Adapter . STATE _ TUR NING _ OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ bluetooth . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠBluetooth Adapter . STATE _ ON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ bluetooth . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Setup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbluetooth Adapter : ĠBluetooth Adapter ? Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity Ġas ĠMainActivity ). getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠĠĠĠĠ Ġbluetooth Manager . adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠBluetooth Adapter . is Disabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ! isEnabled ĊĊĠĠĠ Ġprivate Ġfun Ġenable Bluetooth () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEns ures ĠBluetooth Ġis Ġavailable Ġon Ġthe Ġdevice Ġand Ġit Ġis Ġenabled . ĠIf Ġnot , ĊĠĠĠĠĠĠĠ Ġ// Ġdisplays Ġa Ġdialog Ġrequesting Ġuser Ġpermission Ġto Ġenable ĠBluetooth . ĊĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Bt Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( enable Bt Intent , ĠREQUEST _ ENABLE _ BT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Permission Granted ( PERMISSION _ REQUEST _ ACCESS _ LOCATION ) ĊĠĠĠ Ġfun Ġsetup Permissions And Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperms Ġ= ĠUtils . get Required Permissions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Easy Permissions . has Permissions ( activity Ġas ĠMainActivity , Ġ* perms )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlready Ġhave Ġpermission , Ġdo Ġthe Ġthing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġhave Ġpermissions , Ġrequest Ġthem Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Permissions . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠgetString ( R . string . permission _ location _ ration ale ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST _ ACCESS _ LOCATION , Ġ* perms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUser Ġchose Ġnot Ġto Ġenable ĠBluetooth . ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ ENABLE _ BT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ bluetooth . isSelected Ġ= ĠresultCode Ġ== ĠActivity . RESULT _ OK ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Setup () ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ ĠCentral Log . d ( TAG , Ġ"[ on Request Permissions Result ] request Code Ġ$ request Code ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST _ ACCESS _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ location . isSelected Ġ= Ġpermissions . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshow Setup () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠSharedPreferences . On Shared Preference ChangeListener Ġ= ĊĠĠĠĠĠĠĠ ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ Ġ_, Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AN NOUN CE MENT " Ġ-> Ġshow Non Empty Anno uncement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear And Hide Anno uncement () Ġ{ ĊĠĠĠĠĠĠĠ Ġview _ announcement . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠPreference . put Anno uncement ( activity !!. application Context , Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Non Empty Anno uncement () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= ĠPreference . get Anno uncement ( activity !!. application Context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( new . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ ĠCentral Log . d ( TAG , Ġ" F CM ĠAnno uncement ĠChanged Ġto Ġ$ new !") ĊĠĠĠĠĠĠĠ Ġtv _ announcement . text Ġ= ĠHtml Compat . from Html ( new , ĠHtml Compat . FROM _ HTML _ MODE _ COMP ACT ) ĊĠĠĠĠĠĠĠ Ġtv _ announcement . movement Method Ġ= Ġobject Ġ: ĠLink Movement Method () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Touch Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget : ĠTextView ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer : ĠSp ann able ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠMotion Event ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event ?. action Ġ== ĠMotion Event . ACTION _ UP Ġ&& Ġwidget Ġ!= Ġnull Ġ&& Ġbuffer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . x Ġ- Ġwidget . total Padding Left Ġ+ Ġwidget . scroll X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . y Ġ- Ġwidget . total Padding Top Ġ+ Ġwidget . scroll Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġwidget . layout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġlayout . getLine For Vertical ( y . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoff Ġ= Ġlayout . get Offset For Horizontal ( line , Ġx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink : ĠArray < out ĠURL Span > Ġ= Ġbuffer . get Spans ( off , Ġoff , ĠURL Span :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear And Hide Anno uncement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( widget , Ġbuffer , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview _ announcement . isVisible Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ