package Ġid . gh uni yu . se kit ar . ui . activity Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . google . android . gms . tasks . On Complete Listener Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . google . android . material . text field . TextInput EditText Ċ import Ġcom . google . firebase . iid . Firebase InstanceId Ċ import Ġcom . or h ano but . h awk . H awk Ċ import Ġes . dm oral . toast y . Toast y Ċ import Ġid . gh uni yu . se kit ar . Build Config Ċ import Ġid . gh uni yu . se kit ar . R Ċ import Ġid . gh uni yu . se kit ar . service . Messaging Service Ċ import Ġid . gh uni yu . se kit ar . service . Scan Service Ċ import Ġid . gh uni yu . se kit ar . ui . dialog . Label Dialog Ċ import Ġid . gh uni yu . se kit ar . utils . Check Aut ost art Permission Ċ import Ġid . gh uni yu . se kit ar . utils . Constant Ċ import Ġid . gh uni yu . se kit ar . utils . Formatter Ċ import Ġid . gh uni yu . se kit ar . utils . Mac Address Retriever Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġorg . jetbrains . ank o . find Ċ import Ġorg . jetbrains . ank o . sdk 2 7 . coroutines . onClick Ċ import Ġorg . jetbrains . ank o . startActivity Ċ import Ġorg . jetbrains . ank o . start Service Ċ import Ġorg . jetbrains . ank o . stop Service Ċ import Ġkotlin . system . exit Process ĊĊ Ċ class ĠMainActivity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġlabel Dialog : ĠLabel Dialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġauto Start Ġ= ĠCheck Aut ost art Permission . getInstance () ĊĠĠĠ Ġprivate Ġval Ġred acted Ġ= ĠarrayOf ( 6 7 , Ġ 1 1 1 , Ġ 1 1 8 , Ġ 1 0 5 , Ġ 1 0 0 , Ġ 4 5 , Ġ 4 9 , Ġ 5 7 ) ĊĠĠĠ Ġprivate Ġval Ġself Check Ġ= ĊĠĠĠĠĠĠĠ ĠarrayOf ( 9 9 , Ġ 1 1 1 , Ġ 1 1 8 , Ġ 1 0 5 , Ġ 1 0 0 , Ġ 4 9 , Ġ 5 7 , Ġ 1 0 0 , Ġ 1 0 5 , Ġ 9 7 , Ġ 1 0 3 , Ġ 1 1 0 , Ġ 1 1 1 , Ġ 1 1 5 , Ġ 1 0 1 ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Layout () Ġ= ĠR . layout . activity _ main ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" MainActivity Tag " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ CO AR SE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ BL U ETO OTH Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ BL U ETO OTH _ DEN Y Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB LU ETO OTH _ DEN Y _ MESSAGE Ġ= Ġ" Ap lik asi Ġtidak Ġd apat Ġdi jal ank an Ġtan pa Ġbluetooth " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetStatus () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( H awk . contains ( Constant . STORAGE _ STATUS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst s Ġ= ĠH awk . get < String >( Constant . STORAGE _ STATUS ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġst s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( sts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" p dp " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . text Ġ= ĠgetString ( R . string . status , Ġ" P asi en ĠD alam ĠPeng aw asan ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . setTextColor ( Context Compat . getColor ( this , ĠR . color . warning )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" od p " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . text Ġ= ĠgetString ( R . string . status , Ġ" Or ang ĠD alam ĠPeng aw asan ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . setTextColor ( Context Compat . getColor ( this , ĠR . color . yellow )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" confirmed " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . text Ġ= ĠgetString ( R . string . status , Ġ" Confirmed ĠPos it if ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . setTextColor ( Context Compat . getColor ( this , ĠR . color . danger )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . text Ġ= ĠgetString ( R . string . status , Ġ" Se hat ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . setTextColor ( Context Compat . getColor ( this , ĠR . color . success )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠsetStatus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġdestroy . onClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Service < Scan Service >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġversion . text Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . version , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Config . VERSION _ NAME . toUpperCase (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Config . VERSION _ CODE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġmy _ label . onClick Ġ{ Ġshow Label Dialog () Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Label () ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter ( Bluetooth Adapter . ACTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( m Receiver , Ġfilter ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( this , ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission ĠGr anted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Bluetooth () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforce Location Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠsetStatus () ĊĊĠĠĠĠĠĠĠ ĠFirebase InstanceId . getInstance (). instanceId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener ( On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" getInstance Id Ġfailed ", Ġtask . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Complete Listener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . STORAGE _ FIRE BASE _ TOKEN , Ġit . token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessaging Service . store Firebase Token ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" getInstance Id Ġsuccess Ġ${ it . token }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Label () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! H awk . get ( Constant . STORAGE _ AN ONY MO US , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( H awk . contains ( Constant . STORAGE _ LABEL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy _ label . text Ġ= ĠH awk . get ( Constant . STORAGE _ LABEL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Label Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy _ label . text Ġ= ĠgetString ( R . string . anon ym ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Label Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġlabel Dialog Ġ= ĠLabel Dialog ( this ) ĊĠĠĠĠĠĠĠ Ġlabel Dialog ?. show () ĊĠĠĠĠĠĠĠ Ġval Ġsave Ġ= Ġlabel Dialog ?. find < Button >( R . id . save _ label ) ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġlabel Dialog ?. find < TextInput EditText >( R . id . label _ input ) ĊĠĠĠĠĠĠĠ Ġval Ġnever Ask Ġ= Ġlabel Dialog ?. find < Button >( R . id . never _ ask ) ĊĊĠĠĠĠĠĠĠ Ġsave ?. onClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text . toString (). isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( H awk . contains ( Constant . STORAGE _ LABEL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . delete ( Constant . STORAGE _ LABEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . STORAGE _ AN ONY MO US , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Label () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" String Empty ĠAn onymous ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text . toString (). length Ġ> Ġ 1 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Ġ= ĠgetString ( R . string . max _ char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text . toString (). length Ġ>= Ġ 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . STORAGE _ AN ONY MO US , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . STORAGE _ LABEL , Ġit . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . success ( this @ MainActivity , ĠgetString ( R . string . th ank you )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Label () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Ġ= ĠgetString ( R . string . min _ char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnever Ask ?. onClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Anonymous ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . STORAGE _ AN ONY MO US , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( H awk . contains ( Constant . STORAGE _ LABEL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . delete ( Constant . STORAGE _ LABEL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Label () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Mac () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠMac Address Retriever . get Bluetooth Address () ĊĠĠĠĠĠĠĠ Ġif Ġ( mac Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity < Mac Input Activity >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . STORAGE _ MAC _ ADDRESS , Ġmac ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth On () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbluetooth On () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( H awk . contains ( Constant . STORAGE _ MAC _ ADDRESS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Aut ost art () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , ĠgetString ( R . string . bluetooth _ active )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service < Scan Service >() ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Mac () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠBluetooth Adapter . ACTION _ STATE _ CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbluetooth State Ġ= Ġintent . getInt Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . EXTRA _ STATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( bluetooth State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ ON Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth On () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ OFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Bluetooth () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Bluetooth () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbt Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bt Adapter Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . error ( this , ĠgetString ( R . string . bluetooth _ un available )). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! bt Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Bluetooth Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( enable Bluetooth Intent , ĠREQUEST _ BL U ETO OTH ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth On () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġforce Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġas ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould ĠEx plain ĠPermission ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . location _ permission )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . request _ location _ permission )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . understand )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity Ġas ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ CO AR SE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CO AR SE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . exit )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo ĠEx planation ĠN eeded ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this Ġas ĠActivity ?) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ CO AR SE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CO AR SE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CO AR SE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Bluetooth () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . error ( this , Ġ" Ap lik asi Ġtidak Ġd apat Ġdi jal ank an Ġtan pa Ġiz in ĠL ok asi ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ BL U ETO OTH Ġ&& ĠresultCode Ġ== ĠRESP ONSE _ BL U ETO OTH _ DEN Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . error ( this , ĠB LU ETO OTH _ DEN Y _ MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshare ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsend Intent : ĠIntent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . EXTRA _ TEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . share _ content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormatter . red acted ( red acted ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormatter . red acted ( red acted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent . create Chooser ( send Intent , ĠgetString ( R . string . share )) ĊĠĠĠĠĠĠĠ ĠstartActivity ( share Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow History ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity < Interaction History Activity >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreport ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity < Report Activity >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġself Check ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( Formatter . red acted ( Build Config . APP _ SELF CHECK _ URL )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( m Receiver ) ĊĠĠĠĠĠĠĠ Ġlabel Dialog ?. dismiss () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Aut ost art () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( auto Start . is Auto Start Permission Available ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( H awk . get ( Constant . CHECK _ AUTO START _ PERMISSION , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . warning )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . aut ost art _ request )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . understand )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġauto Start . get Auto Start Permission ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* if Ġ(! success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . o ops )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . aut ost art _ manual )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . understand )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . provider . Settings . ACTION _ APPLICATION _ DETAILS _ SETTINGS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package :$ packageName " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . ignore )) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH awk . put ( Constant . CHECK _ AUTO START _ PERMISSION , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Stats ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity < Information Activity >() ĊĠĠĠ Ġ} Ċ } Ċ