package Ġcom . example . h udson mc ash an . g ur ad iana ange l Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app .* Ċ import Ġandroid . app . Notification .* Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . bluetooth . le .* Ċ import Ġandroid . widget . Button Ċ import Ġkotlinx . android . synt hetic . main . activity _ connection .* Ċ import Ġjava . util .* Ċ import Ġorg . alt beacon . beacon .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . widget . Remote Views Ċ import Ġandroid . widget . Toast Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content .* Ċ import Ġandroid . os .* Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log .* Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . example . h udson mc ash an . g ur ad iana ange l . Settings . Prefs Ċ import Ġcom . example . h udson mc ash an . g ur ad iana ange l . Settings . Settings Activity Ċ import Ġcom . example . h udson mc ash an . g ur ad iana ange l . Settings . TAG _ SETTINGS Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġkotlinx . android . synt hetic . main . fragment _ device .* Ċ import Ġkotlin . concurrent . schedule Ċ import Ġkotlin . math . round ToInt Ċ Ċ // ĠTimeout s Ċ const Ġval Ġscanner Timeout Ġ= Ġ 1 0 0 0 0 L Ċ const Ġval Ġspinner Timeout Ġ= Ġ 1 0 0 0 0 L Ċ Ċ // ĠApp Ġinfo Ċ const Ġval Ġapp Identifier Ġ= Ġ" com . example . h udson mc ash an . g ur ad iana ange l " Ċ const Ġval Ġapp Title Ġ= Ġ" Guard ian ĠAn gel " Ċ Ċ // ĠTags Ċ const Ġval ĠTAG _ BE AC ON Ġ= Ġ" Beacon Device Activity " Ċ const Ġval ĠTAG _ BL U ETO OTH Ġ= Ġ" Bluetooth Device Activity " Ċ const Ġval ĠTAG _ NOTIFICATION Ġ= Ġ" Notification Device Activity " Ċ Ċ // ĠState Ġof Ġconnection Ċ const Ġval ĠSTATE _ DIS CONNECTED Ġ= Ġ 0 Ċ const Ġval ĠSTATE _ CONNECT ING Ġ= Ġ 1 Ċ const Ġval ĠSTATE _ CONNECTED Ġ= Ġ 2 Ċ const Ġval ĠSTATE _ TEMP _ SENSOR _ OFF Ġ= Ġ 3 Ċ var Ġm Connection State Ġ= ĠSTATE _ DIS CONNECTED Ċ Ċ const Ġval ĠENABLE _ BT _ REQUEST _ CODE Ġ= Ġ 1 Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ @ Target Api ( 2 6 ) Ċ class ĠDevice Activity Ġ: ĠAppCompatActivity (), ĠBe acon Consumer Ġ{ ĊĠĠĠ Ġ// ĠNotification Ġproperties ĊĠĠĠ Ġprivate Ġval Ġtoo Far Notification Description Ġ= Ġ" You Ġare Ġfar Ġfrom Ġthe Ġc ush ion " ĊĠĠĠ Ġprivate Ġval Ġin Region Notification Description Ġ= Ġ" Entered Ġregion " ĊĠĠĠ Ġprivate Ġval Ġtoo Hot Notification Description Ġ= Ġ" It 's Ġtoo Ġhot !" ĊĊĠĠĠ Ġ// ĠBe acon Ġproperties ĊĠĠĠ Ġlateinit Ġvar Ġbe acon Manager : ĠBe acon Manager ĊĠĠĠ Ġlateinit Ġvar Ġmy Region : ĠRegion ĊĊĠĠĠ Ġ// ĠBluetooth Ġproperties ĊĠĠĠ Ġlateinit Ġvar Ġbluetooth Manager : ĠBluetooth Manager ĊĠĠĠ Ġlateinit Ġvar Ġbluetooth Adapter : ĠBluetooth Adapter ĊĠĠĠ Ġlateinit Ġvar Ġble Scanner : ĠBluetooth Le Scanner ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Le Service : ĠBluetooth Le Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Sc anning : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġis Weight Detected : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠPreference Ġproperty ĊĠĠĠ Ġvar Ġprefs : ĠP refs ? Ġ= Ġnull ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ connection ) ĊĊĠĠĠĠĠĠĠ Ġprefs Ġ= ĠP refs ( this ) ĊĠĠĠĠĠĠĠ Ġsetup TabBar () ĊĠĠĠĠĠĠĠ Ġsetup ActionBar () ĊĠĠĠĠĠĠĠ Ġsetup Write Settings () ĊĠĠĠĠĠĠĠ Ġsetup Info Button () ĊĠĠĠĠĠĠĠ Ġsetup Settings Button () ĊĊĠĠĠĠĠĠĠ Ġsetup UART () ĊĠĠĠĠĠĠĠ Ġsetup Beacon () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġregister Receiver ( m Gatt Update Receiver , Ġmake Gatt Update Intent Filter ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Connection State Ġ== ĠSTATE _ DIS CONNECTED Ġ&& Ġbluetooth Manager . adapter Ġ!= Ġnull ) Ġ{ Ġstart Scan () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġ// Ġturn Ġoff Ġbe acon ĊĠĠĠĠĠĠĠ Ġbe acon Manager . unbind ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġturn Ġoff ĠUART ĊĠĠĠĠĠĠĠ Ġun bind Service ( m Service Connection ) ĊĠĠĠĠĠĠĠ Ġm Bluetooth Le Service Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġturn Ġoff Ġreceiver ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( m Gatt Update Receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġgps Fragment Ġ= ĠGPS Fragment () ĊĠĠĠ Ġprivate Ġval Ġdevice Fragment Ġ= ĠDevice Fragment () ĊĠĠĠ Ġprivate Ġval Ġfragment Manager Ġ= Ġsupport FragmentManager ĊĠĠĠ Ġprivate Ġvar Ġactive Fragment : ĠFragment Ġ= Ġdevice Fragment ĊĊĠĠĠ Ġprivate Ġfun Ġsetup TabBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbottom Navigation : ĠBottom Navigation View Ġ= ĠfindViewById ( R . id . navigation View ) ĊĠĠĠĠĠĠĠ Ġbottom Navigation . setOn Navigation ItemSelected Listener ( m On Navigation ItemSelected Listener ) ĊĠĠĠĠĠĠĠ Ġfragment Manager . beginTransaction (). add ( R . id . main _ container , Ġgps Fragment ," 2 "). hide ( gps Fragment ). commit () ĊĠĠĠĠĠĠĠ Ġfragment Manager . beginTransaction (). add ( R . id . main _ container , Ġdevice Fragment , Ġ" 1 "). commit () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm On Navigation ItemSelected Listener Ġ= ĠBottom Navigation View . On Navigation ItemSelected Listener Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ device Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . beginTransaction (). hide ( active Fragment ). show ( device Fragment ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Fragment Ġ= Ġdevice Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . navigation _ gps Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . beginTransaction (). hide ( active Fragment ). show ( gps Fragment ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Fragment Ġ= Ġgps Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Navigation ItemSelected Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup ActionBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( findViewById ( R . id . device _ toolbar )) ĊĠĠĠĠĠĠĠ Ġset ActionBar Title ( m Connection State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset ActionBar Title ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Ġ= Ġsupport ActionBar ĊĠĠĠĠĠĠĠ Ġwhen ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġaction Bar !!. title Ġ= ĠgetString ( R . string . not Connected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġaction Bar !!. title Ġ= ĠgetString ( R . string . connecting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġaction Bar !!. title Ġ= ĠgetString ( R . string . connected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġaction Bar !!. title Ġ= ĠgetString ( R . string . temp Sensor Off ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Write Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcan Write Ġ= ĠSettings . System . can Write ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Write ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . ACTION _ MANAGE _ WRITE _ SETTINGS ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhandle Ġnot Ġbeing Ġable Ġto Ġ( show Ġerror ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Info Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġinfo _ device _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Button Ġ= ĠfindViewById < Button >( R . id . info _ device _ button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠInfo Device Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Settings Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Button Ġ= ĠfindViewById < Button >( R . id . settings _ button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSettings Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsetup Beacon () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . subject . onNext (" beacon Connecting ") ĊĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠBe acon Ġproperties ĊĠĠĠĠĠĠĠ Ġbe acon Manager Ġ= ĠBe acon Manager . getInstance For Application ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġuuid : ĠUUID Ġ= ĠUUID . fromString (" fda 5 0 6 9 3 - a 4 e 2 - 4 fb 1 - af cf - c 6 eb 0 7 6 4 7 8 2 5 ") ĊĠĠĠĠĠĠĠ Ġval Ġid 1 : ĠIdentifier Ġ= ĠIdentifier . from Uuid ( uuid ) ĊĠĠĠĠĠĠĠ Ġval Ġid 2 : ĠIdentifier Ġ= ĠIdentifier . from Int ( 1 0 0 1 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġid 3 : ĠIdentifier Ġ= ĠIdentifier . from Int ( 1 0 0 1 1 ) ĊĠĠĠĠĠĠĠ Ġmy Region Ġ= ĠRegion (" my _ beacon _ region ", Ġid 1 , Ġid 2 , Ġid 3 ) ĊĠĠĠĠĠĠĠ Ġbe acon Manager . beacon Parsers . add ( Beacon Parser (). set Beacon Layout (" m : 2 - 3 = 0 2 1 5 , i : 4 - 1 9 , i : 2 0 - 2 1 , i : 2 2 - 2 3 , p : 2 4 - 2 4 ")) ĊĠĠĠĠĠĠĠ Ġbe acon Manager . bind ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠSetup Ġlocation Ġpermissions Ġ( API Ġ 2 3 Ġand Ġgreater ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . check Self Permission ( android . Manifest . permission . ACCESS _ CO AR SE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle (" This Ġapp Ġneeds Ġlocation Ġaccess ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setMessage (" Please Ġgrant Ġlocation Ġaccess Ġso Ġthis Ġapp Ġcan Ġdetect Ġbe ac ons ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( android . R . string . ok , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setOn Dismiss Listener Ġ{ Ġrequest Permissions ( array Of ( android . Manifest . permission . ACCESS _ CO AR SE _ LOCATION ), Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// TODO : ĠError Ġmessage Ġthat Ġthe Ġapp Ġisn 't Ġcompatible Ġwith Ġthe Ġphone ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup UART () Ġ{ ĊĠĠĠĠĠĠĠ Ġbluetooth Manager Ġ= Ġget System Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Manager . adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter Ġ= Ġbluetooth Manager . adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBluetooth Ġis Ġnot Ġenabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Bt Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Device Activity . startActivity For Result ( enable Bt Intent , ĠENABLE _ BT _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġ" En abling ĠBluetooth !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Connection State Ġ!= ĠSTATE _ TEMP _ SENSOR _ OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBluetooth Ġis Ġenable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Scan () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Connection State Ġ== ĠSTATE _ CONNECTED Ġ|| Ġm Connection State Ġ== ĠSTATE _ CONNECT ING ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġhas Ġto Ġbe Ġeither Ġconnecting Ġor Ġconnected Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd ( TAG _ BL U ETO OTH ," it Ġis Ġeither Ġconnected Ġor Ġconnecting ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scan () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdisplay Ġerror Ġwith Ġability Ġto Ġretry Ġor Ġcancel Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġscanner Timeout ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( this @ Device Activity , ĠBluetooth Le Service :: class . java ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Service ( it , Ġm Service Connection , ĠContext . BIND _ AUTO _ CREATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" UART Ġsetup ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhave Ġthe Ġformat Ġof Ġthe ĠAlertDialog Ġlook Ġn icer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġa Ġnew Ġinstance Ġof ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this @ Device Activity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġalert Ġdialog Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle (" Error !") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġa Ġmessage Ġon Ġalert Ġdialog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setMessage (" Bluetooth Ġis Ġnot Ġavailable Ġon Ġthis Ġdevice ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġa Ġneutral Ġbutton Ġon Ġalert Ġdialog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Neutral Button (" Ok "){ _, _ Ġ-> Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġgive Ġmore Ġinformation Ġfor Ġthe Ġuser Ġto Ġdo Ġfix Ġthe Ġproblem Ġ( email Ġsupport ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġcould Ġsimply Ġbe Ġbecause Ġthe Ġbluetooth Ġis Ġturned Ġoff ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinally , Ġmake Ġthe Ġalert Ġdialog Ġusing Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog : ĠAlertDialog Ġ= Ġbuilder . create () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġthe Ġalert Ġdialog Ġon Ġapp Ġinterface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" Bluetooth Ġis Ġnot Ġavailable Ġon Ġthis Ġdevice ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBluetooth Ġis Ġnot Ġavailable Ġon Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule ( 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . subject . onNext (" not Connected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUsed Ġto Ġconnect ĠUART ĊĠĠĠ Ġprivate Ġval Ġm Service Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( component Name : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service Ġ= Ġ( service Ġas ĠBluetooth Le Service . Local Binder ). service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Bluetooth Le Service !!. initialize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ( TAG _ BL U ETO OTH , Ġ" Unable Ġto Ġinitialize ĠBluetooth ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" callback Ġfrom Ġservice Ġconnection ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( component Name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUsed Ġto Ġenable ĠBluetooth ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Check Ġwhat Ġrequest Ġwe âĢĻ re Ġrespon ding Ġto ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠENABLE _ BT _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġwas Ġsuccessful ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġ" Bluetooth Ġhas Ġbeen Ġenabled ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġwas Ġun successful ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result Code Ġ== ĠRESULT _ C ANCE LED ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġ" An Ġerror Ġoccurred Ġwhile Ġattempting Ġto Ġenable ĠBluetooth ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠNotification ĊĠĠĠ Ġprivate Ġfun Ġsend Notification ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager : ĠNotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġnotification Channel : ĠNotification Channel ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġbuilder : ĠBuilder ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠDevice Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getActivity ( this , Ġ 0 , Ġintent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Layout Ġ= ĠRemote Views ( packageName , ĠR . layout . notification _ layout ) ĊĠĠĠĠĠĠĠ Ġnotification Layout . setText View Text ( R . id . notification _ title , Ġapp Title ) ĊĠĠĠĠĠĠĠ Ġnotification Layout . setText View Text ( R . id . notification _ content , Ġdescription ) ĊĠĠĠĠĠĠĠ Ġval Ġsmall Icon Ġ= ĠR . mip map . notification _ icon _ round ĊĠĠĠĠĠĠĠ Ġval Ġlarge Icon Ġ= ĠBitmap Factory . decode Resource ( this . resources , ĠR . mip map . notification _ icon _ round ) ĊĠĠĠĠĠĠĠ Ġi ( TAG _ SETTINGS , Ġ" SDK ĠVERSION : Ġ${ Build . VERSION . SDK _ INT }") ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel Ġ= ĠNotification Channel ( app Identifier , Ġdescription , ĠNotification Manager . IMPORT ANCE _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . enable Lights ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . light Color Ġ= ĠColor . MAG ENT A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . enable V ibration ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( notification Channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ= ĠBuilder ( this , Ġapp Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . mip map . notification _ icon ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( Notification Compat . Decorated Custom View Style ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom ContentView ( notification Layout ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom Big ContentView ( notification Layout Expanded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Channel Id ( app Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuilder Ġ= ĠBuilder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( small Icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Weight Status ( is Weight Detected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġonly Ġsend Ġnotifications Ġif Ġweight Ġis Ġdetected ĊĠĠĠĠĠĠĠ Ġthis . is Weight Detected Ġ= Ġis Weight Detected ĊĠĠĠĠĠĠĠ Ġweight _ label . text Ġ= Ġif Ġ( is Weight Detected ) Ġ" Yes " Ġelse Ġ" No " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMan ages ĠBe acon Ġconnection ĊĠĠĠ Ġoverride Ġfun Ġon Beacon Service Connect () Ġ{ ĊĠĠĠĠĠĠĠ Ġbe acon Manager . removeAll Monitor Not ifiers () ĊĠĠĠĠĠĠĠ Ġbe acon Manager . removeAll Range Not ifiers () ĊĠĠĠĠĠĠĠ Ġbe acon Manager . add Range Notifier Ġ{ Ġbe ac ons , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( be ac ons . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe acon Ġ= Ġbe ac ons . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġbe acon . distance . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BE AC ON , Ġ" beacon Ġdistance : Ġ$ distance ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Connection State Ġ== ĠSTATE _ DIS CONNECTED Ġ&& Ġbluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġdisconnected Ġfrom ĠUART Ġbut Ġr anging Ġthen Ġwe Ġare Ġclose Ġenough Ġto Ġconnect ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// start Scan () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhave Ġthe Ġbe acon Ġbe Ġdisconnected Ġas Ġwell Ġwhen ĠUART Ġis Ġdisconnected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠInt . MIN _ VALUE Ġuntil Ġ 0 Ġ-> Ġbe acon _ label . text Ġ= ĠgetString ( R . string . not Connected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 5 Ġ-> Ġbe acon _ label . text Ġ= ĠgetString ( R . string . very Close ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 .. 1 0 Ġ-> Ġbe acon _ label . text Ġ= ĠgetString ( R . string . near ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbe acon _ label . text Ġ= ĠgetString ( R . string . far ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe acon Manager . start R anging Be ac ons In Region ( my Region ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRemoteException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BE AC ON , Ġ" R anging Ġfailed !! !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbe acon Manager . add Monitor Notifier ( object Ġ: ĠMonitor Notifier Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdid Enter Region ( region : ĠRegion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BE AC ON , Ġ" H ola ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Connection State Ġ== ĠSTATE _ DIS CONNECTED ) Ġ{ Ġstart Scan () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdid Exit Region ( region : ĠRegion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BE AC ON , Ġ" A di os ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . subject . onNext (" beacon Not Connected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdid Det ermine State For Region ( state : ĠInt , Ġregion : ĠRegion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BE AC ON , Ġ" I Ġhave Ġjust Ġswitched Ġfrom Ġseeing / not Ġseeing Ġbe ac ons : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe acon Manager . start Monitoring Be ac ons In Region ( my Region ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRemoteException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BE AC ON , Ġ" Monitoring Ġfailed !! !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠInit i ates ĠBluetooth Ġpair ing Ġprocess ĊĠĠĠ Ġprivate Ġfun Ġstart Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" starting Ġscan ") ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . isEnabled Ġ&& Ġ! is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" Sc anning ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet ĠState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Connection State Ġ== ĠSTATE _ CONNECTED Ġ|| Ġm Connection State Ġ== ĠSTATE _ CONNECT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġhas Ġto Ġbe Ġeither Ġconnecting Ġor Ġconnected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd ( TAG _ BL U ETO OTH ," it Ġis Ġeither Ġconnected Ġor Ġconnecting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdisplay Ġerror Ġwith Ġability Ġto Ġretry Ġor Ġcancel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġscanner Timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . subject . onNext (" connecting ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġble Scanner Ġ= Ġbluetooth Adapter . bluetooth Le Scanner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscan Filter Ġ= ĠScan Filter . Builder (). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠScan Settings . Builder (). set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ LAT ENCY ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġble Scanner . start Scan ( Arrays . asList ( scan Filter ), Ġsettings , Ġscan Callback ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbluetooth Adapter . bluetooth Le Scanner . stop Scan ( scan Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscan Callback Ġ= Ġobject : ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Sensor On Off Ġ= Ġprefs ?. temp Sensor On Off Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! temp Sensor On Off ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet ĠState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection State Ġ= ĠSTATE _ TEMP _ SENSOR _ OFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar Title ( STATE _ TEMP _ SENSOR _ OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( getString ( R . string . uart Name ) Ġ== Ġresult . device . name Ġ&& Ġm Connection State Ġ== ĠSTATE _ DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet ĠState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection State Ġ= ĠSTATE _ CONNECT ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar Title ( m Connection State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Device Address Ġ= Ġresult . device . address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Le Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Result Ġ= Ġm Bluetooth Le Service !!. connect UART ( m Device Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd ( TAG _ BL U ETO OTH , Ġ" Connect Ġrequest Ġresult =$ connection Result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd ( TAG _ BL U ETO OTH , Ġ" Bluetooth Ġservice Ġis Ġnull !! !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdisplay Ġerror Ġwith Ġability Ġto Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHandles Ġvarious Ġevents Ġfired Ġby Ġthe ĠService . ĊĠĠĠ Ġ// ĠACTION _ G ATT _ CONNECTED : Ġconnected Ġto Ġa ĠG ATT Ġserver . ĊĠĠĠ Ġ// ĠACTION _ G ATT _ DIS CONNECTED : Ġdisconnected Ġfrom Ġa ĠG ATT Ġserver . ĊĠĠĠ Ġ// ĠACTION _ DATA _ AVAILABLE : Ġreceived Ġdata Ġfrom Ġthe Ġdevice . Ġ ĠThis Ġcan Ġbe Ġa Ġresult Ġof Ġread ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Ġnotification Ġoperations . ĊĠĠĠ Ġprivate Ġval Ġm Gatt Update Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ G ATT _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet ĠState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection State Ġ= ĠSTATE _ CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar Title ( m Connection State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . hide Temp Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . hide Weight Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ G ATT _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( too Far Notification Description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet ĠState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection State Ġ= ĠSTATE _ DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// hide Temp Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . subject . onNext (" not Connected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ DATA _ AVAILABLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġintent . getString Extra ( Bluetooth Le Service . EXTRA _ DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Counter Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( data Ġ!= Ġnull Ġ&& Ġdata Counter Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse And Display Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠDelay Ġtime Ġbetween Ġshowing Ġupdated Ġdata ĊĠĠĠ Ġvar Ġdata Counter Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġparse And Display Data ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Sensor On Off Ġ= Ġprefs ?. temp Sensor On Off Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( temp Sensor On Off ) Ġ{ Ġ// ĠTemp ĠSensor Ġis ĠOn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Array Ġ= Ġdata . split (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Temp Ġ= Ġdata Array [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Weight Ġ= Ġdata Array [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc els ius Temp Ġ= Ġparse Temp ( raw Temp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġparse Weight ( raw Weight ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfa hren heit C els ius Ġ= Ġprefs ?. fahren heit C els ius Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fahren heit C els ius ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfa hren heit Temp Ġ= Ġ( cel s ius Temp . toDouble () Ġ* Ġ 9 / 5 Ġ+ Ġ 3 2 ). round ToInt (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfa hren heit Temp With Degree Ġ= Ġ"$ fahren heit Temp Â° F " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" temp : Ġ$ fahren heit Temp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp _ progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp _ label . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp _ label . text Ġ= Ġfa hren heit Temp With Degree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc els ius Temp With Degree Ġ= Ġ"$ cel s ius Temp Â° C " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" temp : Ġ$ cel s ius Temp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp _ progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp _ label . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// temp _ label . text Ġ= Ġc els ius Temp With Degree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( weight Ġ< Ġ 3 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Weight Status ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ( TAG _ BL U ETO OTH , Ġ" weight : Ġ$ weight ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠTemp ĠSensor Ġis ĠOff ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet ĠState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection State Ġ= ĠSTATE _ TEMP _ SENSOR _ OFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ActionBar Title ( STATE _ TEMP _ SENSOR _ OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp _ progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Fragment . temp _ label . text Ġ= ĠgetString ( R . string . not Connected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Data () Ġ{} ĊĊĊĠĠĠ Ġprivate Ġfun Ġparse Temp ( temp : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregex 1 Ġ= Ġ""" ( T = ) """. to Regex () ĊĠĠĠĠĠĠĠ Ġval Ġtemp 2 Ġ= Ġregex 1 . replace ( temp , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġregex 2 Ġ= Ġ""" ( ,) """. to Regex () ĊĠĠĠĠĠĠĠ Ġreturn Ġregex 2 . replace ( temp 2 , ". ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Weight ( weight : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregex 1 Ġ= Ġ""" ( W = ) """. to Regex () ĊĠĠĠĠĠĠĠ Ġreturn Ġregex 1 . replace ( weight , Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmake Gatt Update Intent Filter (): ĠIntent Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Filter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ G ATT _ CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ G ATT _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ DATA _ AVAILABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġintent Filter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }